gpt4 book ai didi

MATLAB 改变重复定时器周期

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:38 25 4
gpt4 key购买 nike

是否可以更改重复计时器的周期(在 TimerFcn 中)?

直觉上,当为 Windows 编程时,我会处理 WM_TIMER 消息并使用 SetTimer 来编辑定时器的周期,但类似的方法在 MATLAB 中似乎不起作用,因为定时器需要重新启动才能更改Period 属性。这会扰乱执行,最好将其描述为将周期更改为接近零。不会产生任何错误。

下面是一些用于创建任务数组的示例代码:每个任务项都包含要做的事情和延迟。该数组基本上由一个计时器遍历,该计时器应根据当前任务延迟更改其 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

呃。

最佳答案

使用两个计时器(例如 timerNamePingtimerNamePong)。在每个计时器的 Action 结束时,下一个计时器设置为在单次模式下执行一次并有一些延迟。

这避免了不断拆除和创建新计时器的需要,并避免了在您尝试编辑当前正在执行的计时器时发生的错误。

下面是一个工作示例来演示:

function setupPingPong

timerPing = timer;
timerPong = timer;

timerPing.TimerFcn = @(~,~)pingPongActivity(true, timerPing, timerPong);
timerPing.Name = 'PingTimer';

timerPong.TimerFcn = @(~,~)pingPongActivity(false, timerPing, timerPong);
timerPong.Name = 'PongTimer';

timerPing.StartDelay = 0;
start(timerPing);

function pingPongActivity(isPing, timerPing, timerPong)
if isPing
disp(['PING (' datestr(now,'yyyy-mm-dd HH:MM:SS.FFF') ')'])
else
disp(['PONG (' datestr(now,'yyyy-mm-dd HH:MM:SS.FFF') ')'])
end
delayTime = ceil(rand*10);
display([' delaying ' num2str(delayTime) ' sec.'])
if isPing
nextTimer = timerPong;
else
nextTimer = timerPing;
end
set(nextTimer,'StartDelay', delayTime);
start(nextTimer);

一旦开始,为了停止疯狂,我使用:

t = timerfind; stop(t); delete(t)

关于MATLAB 改变重复定时器周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com