使用tic / toc函数代替计时器

时间:2017-01-13 17:28:27

标签: matlab timer counter

使用timer对象变得太复杂,尤其是当您必须使用多个计时器时,我试图考虑其他方法。

我想避免使用pause,因为它会阻止其他函数执行。我曾考虑使用tic toc函数来衡量已用时间,但我在下面编写的代码并不像我预期的那样有效。

time=tic;
if(abs(toc(time)))==3 %% if 3 second past
    my function
end

如何修改此代码以便在3秒后执行命令?

3 个答案:

答案 0 :(得分:7)

TLDR;

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; =而不是==。如果它错过了确切的值,那将会发现它。