使用 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 循环的阻塞行为。