将Matlab计时器对象重置为时间0

时间:2013-04-11 19:26:45

标签: matlab timer

我使用Matlab计时器对象以固定间隔(每1800秒)旋转一些日志文件:

rotateTimer = timer( ...
    'Name', 'Log Rotator', ...
    'Period', 1800, ...
    'StartDelay', 1800, ...
    'ExecutionMode', 'fixedSpacing', ...
    'TimerFcn', {@RotateLogs});
start(rotateTimer);

此方法适用于自动旋转,但我需要允许用户手动旋转日志文件。

当手动旋转时,我希望1800秒后进行下一次自动旋转;这要求我“重置”定时器对象,以便在手动旋转时从0开始向上计数。

我没有看到我可以调用的属性或方法会使计时器归零。启动和停止计时器不会重置它,它只是从它的位置继续计数。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:3)

另一种不需要重新创建计时器对象的方法:

per = 2;
t = timer('Period'       , per, ...
          'StartDelay'   , per, ...
          'ExecutionMode', 'fixedSpacing',...
          'TimerFcn'     , 'disp(toc);tic;',...
          'StopFcn'      , {@mystop,per},...
          'StartFcn'     , 'tic;');

% Suppress warning from millisecond precision of StartDelay
warning('off','MATLAB:TIMER:STARTDELAYPRECISION')

start(t)
stop(t)
delete(t)

其中mystop()

function mystop(obj,event,in)
    t = toc;
    set(obj,'StartDelay',in-t);
    disp(t)     % Not necessary, just to check
    tic         % Not necessary, just to check 
end

这里的想法是,你可以在每次停止后重置StartDelay,为此你需要计算每次定时器执行之间经过的时间。这意味着您必须在每次执行时重置。

备注

  • StartFcn()处的重置是为了防止以前调用StartDelay的否定tic(如果适用)。
  • disp(toc)中的TimerFcn不是必需的,只是检查时间是否合适。
  • 相同的检查目的是为mystop()中的两个注释行提供服务。

答案 1 :(得分:0)

也许我只是误解了你在说什么,但你不能只使用'set'命令来计时器吗?

通过命令窗口:

help timer
...
Getting and setting parameters:
    get              - Get value of timer object property.
    set              - Set value of timer object property.

因此,当手动旋转时,只需将计时器设置回0

答案 2 :(得分:0)

我无法按照我的意图通过“重置”计时器对象来解决这个问题。

有效的解决方案:

  • 我有一个重复的计时器对象,一旦启用了日志记录,就会以固定的间隔(0.5秒)触发。
  • 首次启用日志记录时,我会调用tic()并保存其结果。
  • 在计时器的回调函数中,我调用toc()来检查自记录开始以来经过的时间。如果经过的时间超过旋转阈值,则执行日志旋转。日志轮换调用tic()以“重置”自旋转到0的时间。
  • 当用户手动旋转日志时,我调用tic()“重置”自旋转后的时间为0并执行日志轮换。

这对我的目的来说足够好。对数旋转之间的时间抖动约为1秒,但这对我来说是可以接受的。如果需要,我可以缩短计时器对象的周期以减少抖动。