使用 tic/toc 函数代替计时器
Using tic/toc functions instead of a timer
使用 timer
对象变得过于复杂,尤其是当您必须使用多个计时器时,所以我试图考虑替代方法。
我想避免使用 pause
,因为它会阻止其他函数的执行。我想过使用 tic
toc
函数来测量经过的时间,但是我在下面编写的代码并不像我预期的那样工作。
time=tic;
if(abs(toc(time)))==3 %% if 3 second past
my function
end
如何修改这段代码,使其在 3 秒后执行命令?
你需要一个 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 循环。
您可以将其设置为 >= 而不是 ==。如果它错过了确切的值,它将捕获它。
TLDR;
tic
/toc
对和 while
循环实际上与使用 pause
没有什么不同,因为它们都会阻止任何其他函数的执行。您必须使用 timer
个对象。
更详细的解释
为了完成这项工作,您需要使用 while
循环来监控是否已超过所需的时间。此外,您需要使用 <
来检查时间是否已经过去,因为不能保证每飞秒评估一次循环条件,因此它永远不会是 exact.
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
循环方法的不幸之处在于它会阻止您一次 运行 多个 "timers"。例如,在下面的例子中,第一个任务等待 3 秒,然后第二个任务等待 5 秒,总共需要 8 秒。
wait(3)
wait(5)
此外,虽然 while
循环是 运行ning,但 nothing else 将能够在 MATLAB 中执行。
一个更好的方法是设置多个 timer
对象并使用回调配置它们,这样它们就可以同时 运行 并且当它们 运行。当您需要多个计时器对象(您认为这很痛苦)时 正好 当您 有 使用 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
此外,由于计时器是 non-blocking(当回调不是 运行ning 时),我可以在启动计时器后立即执行命令
wait(3)
disp('Started 3 second timer')
wait(5)
disp('Started 5 second timer')
如果您在 while 循环中尝试此操作,您将看到 while
循环的阻塞行为。
使用 timer
对象变得过于复杂,尤其是当您必须使用多个计时器时,所以我试图考虑替代方法。
我想避免使用 pause
,因为它会阻止其他函数的执行。我想过使用 tic
toc
函数来测量经过的时间,但是我在下面编写的代码并不像我预期的那样工作。
time=tic;
if(abs(toc(time)))==3 %% if 3 second past
my function
end
如何修改这段代码,使其在 3 秒后执行命令?
你需要一个 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 循环。
您可以将其设置为 >= 而不是 ==。如果它错过了确切的值,它将捕获它。
TLDR;
tic
/toc
对和 while
循环实际上与使用 pause
没有什么不同,因为它们都会阻止任何其他函数的执行。您必须使用 timer
个对象。
更详细的解释
为了完成这项工作,您需要使用 while
循环来监控是否已超过所需的时间。此外,您需要使用 <
来检查时间是否已经过去,因为不能保证每飞秒评估一次循环条件,因此它永远不会是 exact.
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
循环方法的不幸之处在于它会阻止您一次 运行 多个 "timers"。例如,在下面的例子中,第一个任务等待 3 秒,然后第二个任务等待 5 秒,总共需要 8 秒。
wait(3)
wait(5)
此外,虽然 while
循环是 运行ning,但 nothing else 将能够在 MATLAB 中执行。
一个更好的方法是设置多个 timer
对象并使用回调配置它们,这样它们就可以同时 运行 并且当它们 运行。当您需要多个计时器对象(您认为这很痛苦)时 正好 当您 有 使用 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
此外,由于计时器是 non-blocking(当回调不是 运行ning 时),我可以在启动计时器后立即执行命令
wait(3)
disp('Started 3 second timer')
wait(5)
disp('Started 5 second timer')
如果您在 while 循环中尝试此操作,您将看到 while
循环的阻塞行为。