是否可以更改重复计时器的周期(在 TimerFcn 中)?
直观地说,在为 Windows 编程时,我会处理 WM_TIMER 消息并使用 SetTimer 来编辑定时器的周期,但类似的方法在 MATLAB 中似乎不起作用,因为需要重新启动定时器才能更改 Period 属性. 这会扰乱执行,最好将其描述为将周期更改为接近零。不会产生错误。
下面是一些用于创建任务数组的示例代码:每个任务项都由要做的事情和延迟组成。该数组基本上是由一个计时器遍历的,它应该根据当前的任务延迟来改变它的周期。
function obj = Scheduler(~)
obj.scheduletimer = timer(...
'TimerFcn',@obj.OnTimer,...
'BusyMode','queue',...
'TasksToExecute',length(obj.tasklist),...
'ExecutionMode','fixedRate');
end
function OnTimer(obj,source,event)
obj.Start(); // Executed task, schedule next
end
function Start(obj)
// Stop timer if needed
if(strcmp(obj.scheduletimer.Running,'on'))
stop(obj.scheduletimer);
end;
// Set new period and resume
if(~isempty(obj.tasklist))
obj.scheduletimer.Period = obj.tasklist(1).something;
start(obj.scheduletimer);
end;
end
当我不弄乱 OnTimer 中的计时器时,一切显然都可以正常工作,但我想在每次迭代时更改 Period。
编辑:我尝试实施 Pursuit 建议的 pingpong 解决方案,但仍然无法正常工作。请注意,切换计时器的想法确实有效,但似乎仍然没有应用周期。
function obj = Scheduler(~)
obj.timer1 = timer(...
'TimerFcn',@obj.OnTimer);
obj.timer2 = timer(...
'TimerFcn',@obj.OnTimer);
end
function OnTimer(obj,source,event)
obj.Start(); // Executed task, schedule next
end
function Start(obj)
if(strcmp(obj.timer1.Running,'on'))
obj.timer2.Period = obj.tasklist{1}{2};
start(obj.timer2);
else
obj.timer1.Period = obj.tasklist{1}{2};
start(obj.timer1);
end;
end
啊。