2016-06-19 19 views
0

タイマオブジェクトを使用して、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 
+0

'stop(t)'は既にタイマーを停止しています。あなたが待っているときは、すでに「stop(t)」と呼んでいるので、あなたが何を待っているのか分かりません。タイマーが止まった後に何かが起きるようにしたいなら、あなたの時間のために@ StopFcnに@ – Suever

+0

@Sueverありがとう! あなたが正しいと思われますが、これはより良い設計上の決定です。私はロジックを修正しようとします。 しかし、私はタイマーのコールバックTimerFcnが行間に積み重なり、GUIコールバックが終了したときだけ続ける理由を理解しようとします。おそらくそれを解放するいくつかの方法があります... – AlBaZ

答えて

0

あなたは単にstop(htimer)を使用して、タイマーを停止してからのすべてをやりたいですタイマーオブジェクトのStopFcnでクリーンアップします。

t = timer('StopFcn', @cleanup); 

function startButtonCallback(varargin) 
    start(t); 
end 

function stopButtonCallback(varargin) 
    stop(t); 
end 

function cleanup(varargin) 
    % Do all of your cleanup stuff here 
end 
+0

これは私が行うことですが、停止ボタンがクリーンアップ()後にのみ実行する必要がある別の測定をトリガーする問題は、実際には前に実行されます:(だから私はそのクリーンアップ終了しました... – AlBaZ

+0

@AlBaZ上記の例では、StopFcnにクリーンアップコードがありません。 – Suever

+0

例を単純化しましたが、「17:19:31.710 begin TimerFcn」と の間にスタックされたTimerFcnが表示されます。 "17:19:45.955 end TimerFcn" – AlBaZ

関連する問題