タイマオブジェクトを使用して、MATLAB 2015b 32bitのCOMドライバ経由でデバイスをサンプリングします。 GUIDEボタンをクリックすると、タイマーを停止し、デバイスを解放し、別のシーケンスを開始する必要があります。しかし、私はタイマーの停止を待つの実装に成功していない。MATLAB:GUIコールバックでタイマーを停止する方法を教えてください。
提案されたwait、waitfor、pause()とdrawnowのループはうまくいかなかったか、どこかで間違いがありました。例えば
:
function timer_step(~,thisEvent)
disp([datestr(now,'HH:MM:SS.FFF'), ' begin ', thisEvent.Type]);
pause(1);
disp([datestr(now,'HH:MM:SS.FFF'), ' end ', thisEvent.Type]);
end
function timer_stop(~,thisEvent)
global t;
disp([datestr(now,'HH:MM:SS.FFF'), ' begin ', thisEvent.Type]);
delete(t);
t = [];
disp([datestr(now,'HH:MM:SS.FFF'), ' end ', thisEvent.Type]);
end
function btnStart_Callback(hObject, eventdata, handles)
global t
t = timer;
t.StartFcn = @(~,thisEvent)disp([datestr(thisEvent.Data.time,'HH:MM:SS.FFF'),...
' executed ', thisEvent.Type]);
t.TimerFcn = @timer_step;
t.StopFcn = @timer_stop;
t.Period = 1;
t.TasksToExecute = 10;
t.ExecutionMode = 'fixedRate';
start(t)
function btnStop_Callback(hObject, eventdata, handles)
global t
disp([datestr(now,'HH:MM:SS.FFF') ' run stop()']);
stop(t)
disp([datestr(now,'HH:MM:SS.FFF') ' begin wait to timer finish']);
% not working solutions:
drawnow();
waitfor(t);
wait(t);
% popups new figure and blocks both this callback and timer's callback:
h = figure;
uiwait(h)
% after closing figure continues to
timeout = 5;
begin_time = tic();
while ~isempty(t) && toc(begin_time)<timeout
disp([num2str(toc(begin_time)),' waiting...']);
drawnow();
wait(t);
pause(1);
end
if ~isempty(t)
disp('got timeout!');
end
出力スタートボタンを押すと、タイマーが停止する前に、停止ボタンを押した後:
>> timer_gui
17:19:29.679 executed StartFcn
17:19:29.681 begin TimerFcn
17:19:30.692 end TimerFcn
17:19:30.694 begin TimerFcn
17:19:31.708 end TimerFcn
17:19:31.710 begin TimerFcn
17:19:31.836 run stop()
17:19:31.837 begin wait to timer finish
% here I get figure pop-up that blocks both callbacks and after closing it continues:
0.0002958 waiting...
1.0116 waiting...
2.0248 waiting...
3.0398 waiting...
4.058 waiting...
got timeout!
17:19:45.955 end TimerFcn
17:19:45.957 begin StopFcn
17:19:45.958 end StopFcn
'stop(t)'は既にタイマーを停止しています。あなたが待っているときは、すでに「stop(t)」と呼んでいるので、あなたが何を待っているのか分かりません。タイマーが止まった後に何かが起きるようにしたいなら、あなたの時間のために@ StopFcnに@ – Suever
@Sueverありがとう! あなたが正しいと思われますが、これはより良い設計上の決定です。私はロジックを修正しようとします。 しかし、私はタイマーのコールバックTimerFcnが行間に積み重なり、GUIコールバックが終了したときだけ続ける理由を理解しようとします。おそらくそれを解放するいくつかの方法があります... – AlBaZ