3

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

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

这种方法非常适合自动轮换,但我需要允许用户手动轮换日志文件。

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

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

4

3 回答 3

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在每次停止后重置,为此您需要计算每次计时器执行之间经过的时间。这意味着您必须在每次执行时重置。

备注

  • 重置 atStartFcn()是为了防止StartDelay先前调用的负数tic(如果适用)。
  • disp(toc)inTimerFcn不是必需的,只是为了检查时间是否正常。
  • 相同的检查目的服务于mystop().
于 2013-04-12T01:53:44.837 回答
0

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

通过命令行窗口:

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

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

于 2013-04-11T20:08:36.737 回答
0

正如我所期望的那样,我无法通过“重置”计时器对象来解决这个问题。

有效的解决方案:

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

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

于 2013-04-18T18:10:18.477 回答