(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 でタイマーをいじらないときは、明らかにすべて正常に動作しますが、反復ごとに期間を変更したいと考えています。
編集: Pursuit によって提案されたピンポン ソリューションを実装しようとしましたが、まだ機能していません。タイマーの切り替えのアイデアは機能しますが、期間はまだ適用されていないようです。
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
うーん。