使用timer
对象变得太复杂,尤其是当您必须使用多个计时器时,我试图考虑其他方法。
我想避免使用pause
,因为它会阻止其他函数执行。我曾考虑使用tic
toc
函数来衡量已用时间,但我在下面编写的代码并不像我预期的那样有效。
time=tic;
if(abs(toc(time)))==3 %% if 3 second past
my function
end
如何修改此代码以便在3秒后执行命令?
答案 0 :(得分:7)
tic
/ toc
对和while
循环与使用pause
完全没有区别,因为它们都阻止执行任何其他功能。您必须使用timer
个对象。
为了完成这项工作,您需要使用while
循环来监控是否已经过了所需的时间。此外,您将需要使用<
来检查时间是否已经过去,因为不能保证每个飞秒都会评估循环条件,因此它永远不会是 exact 。< / p>
function wait(time_in_sec)
tic
while toc < time_in_sec
end
% Do thing after 3 seconds
fprintf('Has been %d seconds!\n', time_in_sec)
end
关于while
循环方法的不幸之处在于它会阻止您同时运行多个“计时器”。例如,在下列情况下,第一个任务将等待3秒钟,然后等待5秒钟进行第二个任务需要总时间或8秒。
wait(3)
wait(5)
此外,当while
循环正在运行时, nothing else将能够在MATLAB中执行。
更好的方法是设置多个timer
对象并使用回调对它们进行配置,以便它们可以同时运行,并且它们在运行时不会阻止MATLAB中的任何操作。当您 使用timer
对象时,如果您需要多个计时器对象(您认为这很痛苦) 。
如果真的那么麻烦,可以编写自己的函数来为你做所有的样板文件
function tmr = wait(time_in_sec)
tmr = timer('StartDelay', time_in_sec, ...
'ExecutionMode', 'SingleShot', ...
'TimerFcn', @(s,e)status(time_in_sec));
tmr.start()
function status(t)
fprintf('Has been %d seconds!\n', t);
end
end
wait(3)
wait(5) % Both will execute after 5 seconds
此外,由于定时器是非阻塞的(当回调未运行时),我可以在启动定时器后立即执行命令
wait(3)
disp('Started 3 second timer')
wait(5)
disp('Started 5 second timer')
如果您使用while循环尝试此操作,您将看到while
循环的阻止行为。
答案 1 :(得分:1)
你需要一个while循环或等待时间为3秒的东西。 像这样的东西
time=tic;
while 1
if(abs(toc(time)))==3 %% if 3 second past
my function
break;
end
end
如果你想每隔3秒拨打my function
,那么你应该这样做:
time=tic;
while 1
if mod((abs(toc(time))),3) == 0 %% if 3 second past
my function
end
end
请确保一旦完成后你有办法告诉你,然后打破while循环。
答案 2 :(得分:1)
您可以将其设置为&gt; =而不是==。如果它错过了确切的值,那将会发现它。