MATLAB从一个函数更新全局变量不会反映在另一个函数中

时间:2012-10-29 04:13:48

标签: function matlab global-variables updates

我有一个使用全局变量的函数,我想从另一个函数改变它的值。即使我尝试过多种方式,使用该值的函数似乎也没有使用全局变量的新值进行更新。这是我正在使用的代码。

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 。但结果是一样的。

2 个答案:

答案 0 :(得分:2)

我认为您需要的是一个后台线程,可以执行calculateTest,同时让您可以从matlab脚本/命令行运行stop。纯粹意义上,MATLAB不支持此功能。您有时可以使用timer功能实现类似的功能。基本上,你告诉MATLAB在经过一段时间后重复运行一个函数。但是,MATLAB在前台运行定时器功能。虽然它正在这样做,但您无法运行stop脚本。因此,您无法在计时器功能中实现长循环。 timer只是安排MATLAB不时执行某些任务,但不实现线程。

您可以使用MEX功能实现自己的后台线程。然后,您可以调用MEX函数将'start'/'stop'命令传递给您的线程。但MEX线程必须在内部进行数据处理。你不能,例如调用一些matlab脚本来完成这项工作。

另一件事。 startstop是管理计时器的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上,直到该函数终止。