1

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

计算.m

function calculateTest()

global isStop;
global value;

value=0;
while ~isStop
    pause(1);
    value = value+1
end

end

开始.m

function start()

global isStop;
isStop = 0;
calculateTest();
end

停止.m

function stop()

global isStop;
isStop = 1;
end

当我调用 start() 时,值开始打印。但即使我调用 stop(),它也永远不会停止。它继续打印。你知道我错过了什么吗?

(我也试过while isStop==0。但结果是一样的。

4

2 回答 2

2

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

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

另一件事。start并且stop是管理定时器的 MATLAB 函数。不要将这些标识符用作您自己的函数的名称 - 这是允许的,但被认为是一种不好的做法。

于 2012-10-29T09:51:42.157 回答
0

您实际上并未在代码中的任何位置调用 stop 函数,因此它没有机会更新全局变量。

例如,您可以通过添加条件测试来修改calculateTest( )

function calculateTest()

global isStop;
global value;

value=0;
while ~isStop
    pause(1);
    value = value+1
    if value == 5
        stop;
    end
end

end

你会发现这可以很好地阻止它。如果您将停止命令添加到 start 中,在 CalculateTest 之后,那将不起作用,因为控制流永远不会到达该行 - 它一直在 CalculateTest 上,直到该函数终止。

于 2012-10-29T04:28:59.203 回答