【问题标题】:MATLAB: How to wait for timer stop inside GUI callback?MATLAB:如何在 GUI 回调中等待计时器停止?
【发布时间】: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


【解决方案1】:

您只想使用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

【讨论】:

  • 这就是我所做的,但停止按钮触发另一个测量的问题应该只在 cleanup() 之后运行,但实际上它在之前运行:( 所以我尝试检测清理完成...
  • @AlBaZ 在上面的示例中,您的StopFcn 中没有任何清理代码。
  • 我把这个例子简单化了。但它仍然显示 TimerFcn 堆叠在:“17:19:31.710 begin TimerFcn”和“17:19:45.955 end TimerFcn”之间
  • @AlBaZ 哦,可能是您的时间段比TimerFcn 的内容执行所需的时间短,这导致必须触发的事件积压。尝试将计时器的BusyMode 设置为drop
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多