下面的程序包含一个timer
对象定义,后跟它的启动命令。然后程序继续执行其他语句。
我的问题是是否TimerFcn
会在0.01
sec 之后准确调用,还是会等到 for 循环完成以触发计时器回调函数?
% My timer object
t = timer('TimerFcn',@(x,y)G2(z), 'StartDelay',0.01);
start(t);
% Other program statements
for i=1:m
...
end
下面的程序包含一个timer
对象定义,后跟它的启动命令。然后程序继续执行其他语句。
我的问题是是否TimerFcn
会在0.01
sec 之后准确调用,还是会等到 for 循环完成以触发计时器回调函数?
% My timer object
t = timer('TimerFcn',@(x,y)G2(z), 'StartDelay',0.01);
start(t);
% Other program statements
for i=1:m
...
end
底线是 MATLAB 实际上是单线程的。因此,如果当前正在执行一个长操作,则计时器回调将没有机会运行,并且根据计时器对象属性(请参阅BusyMode
),将改为将事件添加到 MATLAB 在第一次获取时最终会经过的队列机会..
据我了解(这是我自己的推测),MATLAB计时器可以在语句之间中断执行,但不能在很长的语句中中断。
所以理论上它应该在 0.01 秒后运行,但不能保证......
该文档说明了以下内容:
注意:定时器的指定执行时间和实际执行时间可能会有所不同,因为定时器对象在 MATLAB 单线程执行环境中工作。此时间延迟的长度取决于 MATLAB 正在执行的其他处理。要强制执行事件队列中的回调函数,请在代码中包含对 drawow 函数的调用。drawow 函数刷新事件队列。
另一个文档页面上也有此注释:
注意:如果回调涉及 CPU 密集型任务(例如更新图形),则回调函数的执行可能会延迟。