【发布时间】:2016-06-19 15:54:23
【问题描述】:
我使用计时器对象通过 MATLAB 2015b 32 位的 COM 驱动程序对设备进行采样。 单击 GUIDE 按钮时,我需要停止计时器,释放设备并开始另一个序列。但是我没有成功实现等待计时器停止。
建议的等待、等待、循环使用 pause() 和 drawow 的解决方案不起作用,或者我在某个地方有错误。
例如:
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 感谢您的宝贵时间!可能你是对的,这是更好的设计决策。我会尝试修改逻辑。但我试图理解为什么计时器的回调 TimerFcn 在行之间堆叠并且仅在 GUI 回调完成时才继续。大概有办法释放吧……
标签: matlab timer matlab-guide