使用 timer
对象变得过于复杂,尤其是当您必须使用多个计时器时,因此我试图考虑替代方法。
我想避免使用 pause
,因为它会阻止其他功能的执行。我想用 tic
toc
测量耗时的函数,但我在下面编写的代码无法按预期工作。
time=tic;
if(abs(toc(time)))==3 %% if 3 second past
my function
end
如何修改此代码以使其在 3 秒后执行命令?
最佳答案
TLDR;
一个 tic
/toc
一对和一个 while
循环实际上与使用 pause
没有什么不同。因为它们都阻止执行任何其他功能。您必须使用 timer
对象。
更详细的解释
为了完成这项工作,您需要使用 while
循环以监视是否经过了所需的时间。此外,您需要使用 <
检查时间是否已经过去,因为不能保证每飞秒都会评估循环条件,因此它永远不会准确。
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
循环正在运行,在 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
循环的阻塞行为。
关于matlab - 使用 tic/toc 函数而不是计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640212/