我使用Matlab计时器对象以固定间隔(每1800秒)旋转一些日志文件:
rotateTimer = timer( ...
'Name', 'Log Rotator', ...
'Period', 1800, ...
'StartDelay', 1800, ...
'ExecutionMode', 'fixedSpacing', ...
'TimerFcn', {@RotateLogs});
start(rotateTimer);
此方法适用于自动旋转,但我需要允许用户手动旋转日志文件。
当手动旋转时,我希望1800秒后进行下一次自动旋转;这要求我“重置”定时器对象,以便在手动旋转时从0开始向上计数。
我没有看到我可以调用的属性或方法会使计时器归零。启动和停止计时器不会重置它,它只是从它的位置继续计数。我怎么能做到这一点?
答案 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)
我无法按照我的意图通过“重置”计时器对象来解决这个问题。
有效的解决方案:
tic()
并保存其结果。toc()
来检查自记录开始以来经过的时间。如果经过的时间超过旋转阈值,则执行日志旋转。日志轮换调用tic()
以“重置”自旋转到0的时间。tic()
“重置”自旋转后的时间为0并执行日志轮换。这对我的目的来说足够好。对数旋转之间的时间抖动约为1秒,但这对我来说是可以接受的。如果需要,我可以缩短计时器对象的周期以减少抖动。