matlab - 使用 tic/toc 函数而不是计时器

标签 matlab timer counter

使用 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/

相关文章:

Java计时器在您单击空格时启动,在再次单击空格后结束

java - CountDownTimer——表示用户递增。问题

r - 在 R 中按组向数据帧添加索引(或计数器)

计算单词出现次数的字典的 C# 实现在输出中返回重复单词

debugging - 为什么断点在 Matlab 编辑器窗口中不可见?

matlab - 计算二维联合概率分布

matlab - 是否可以为 matlab 构建一个大内存系统?

c# - 代码应在短暂延迟后执行一次

python - 如何合并多个defaultdict(Counter)?

arrays - 我如何在 MATLAB 中进行多重赋值?