我有一个使用全局变量的函数,我想从另一个函数改变它的值。即使我尝试过多种方式,使用该值的函数似乎也没有使用全局变量的新值进行更新。这是我正在使用的代码。
calculate.m
function calculateTest()
global isStop;
global value;
value=0;
while ~isStop
pause(1);
value = value+1
end
end
start.m
function start()
global isStop;
isStop = 0;
calculateTest();
end
stop.m
function stop()
global isStop;
isStop = 1;
end
当我调用start()时,值开始打印。但即使我调用stop(),它也永远不会停止。它一直在打印。你知道我错过了什么吗?
(我已尝试而isStop == 0 。但结果是一样的。
答案 0 :(得分:2)
我认为您需要的是一个后台线程,可以执行calculateTest
,同时让您可以从matlab脚本/命令行运行stop
。纯粹意义上,MATLAB不支持此功能。您有时可以使用timer
功能实现类似的功能。基本上,你告诉MATLAB在经过一段时间后重复运行一个函数。但是,MATLAB在前台运行定时器功能。虽然它正在这样做,但您无法运行stop
脚本。因此,您无法在计时器功能中实现长循环。 timer
只是安排MATLAB不时执行某些任务,但不实现线程。
您可以使用MEX功能实现自己的后台线程。然后,您可以调用MEX函数将'start'/'stop'
命令传递给您的线程。但MEX线程必须在内部进行数据处理。你不能,例如调用一些matlab脚本来完成这项工作。
另一件事。 start
和stop
是管理计时器的MATLAB函数。不要将这些标识符用作您自己的函数的名称 - 这是允许的,但被认为是一种不好的做法。
答案 1 :(得分:0)
您实际上没有在代码中的任何位置调用stop函数,因此没有机会更新全局变量。
例如,您可以通过添加条件测试来修改calculateTest(),当“值”达到某个数字时会调用stop函数,例如5: -
function calculateTest()
global isStop;
global value;
value=0;
while ~isStop
pause(1);
value = value+1
if value == 5
stop;
end
end
end
你会发现这完全阻止它。如果你将stop命令添加到start中,那么在CalculateTest之后,由于控制流永远不会到达那一行,它将无法工作 - 它将保留在CalculateTest上,直到该函数终止。