【发布时间】:2017-08-23 08:16:43
【问题描述】:
我试图在每秒后打印一条警告或一条消息,例如“1 秒已过”。 有没有可能意识到这一点?
我用 tic toc 和一个循环试过了,但是还不够。此外,我从来没有准确地得到一秒钟。是否有自动打印每 X 毫秒的命令? 有什么想法吗?
提前致谢。
【问题讨论】:
标签: matlab timer setinterval
我试图在每秒后打印一条警告或一条消息,例如“1 秒已过”。 有没有可能意识到这一点?
我用 tic toc 和一个循环试过了,但是还不够。此外,我从来没有准确地得到一秒钟。是否有自动打印每 X 毫秒的命令? 有什么想法吗?
提前致谢。
【问题讨论】:
标签: matlab timer setinterval
使用timer 对象。
t = timer;
t.ExecutionMode = 'fixedRate';
t.Period = 1;
t.TimerFcn = @(~,~)disp('1s elapsed');
start(t)
【讨论】:
作为@Daniel suggested,计时器对象是要走的路。
要记住的一点是,MATLAB 计时器异步执行,但它们是 not truly parallel(即使 timer objects run in a different thread,MATLAB 解释器仍然是 single-threaded)。
因此计时器事件可能不会触发(BusyMode 属性默认为 drop),因为它们发生在某些冗长的不可中断操作(如内置函数、MEX 函数等)期间。
这是一个例子:
>> t = timer('ExecutionMode','fixedRate', 'Period',1, 'BusyMode','drop', ...
'TimerFcn',@(~,~)disp(datestr(now,'MM:SS')));
>> start(t)
35:21
35:22
35:23
>> eig(rand(2000)); % <-- takes a couple of seconds to finish
35:27
35:28
35:29
35:30
>> stop(t)
请注意,当EIG 函数正在运行时,计时器事件没有机会执行。
现在如果我们将BusyMode property 更改为queue,那么在EIG 操作执行期间事件将再次不会触发,但一旦EIG 完成,将立即吐出所有排队的事件:
>> t.BusyMode = 'queue';
>> start(t)
37:39
37:40
>> eig(rand(2000));
37:45
37:45
37:45
37:45
37:45
37:46
37:47
>> stop(t)
>> delete(t)
【讨论】:
它被称为pause。可选参数以秒为单位指定持续时间。文档:http://www.mathworks.de/de/help/matlab/ref/pause.html
【讨论】: