尽管使用了drawow并暂停

时间:2016-10-14 00:52:14

标签: matlab matlab-guide hang pause drawnow

我有一个MATLAB GUI,如下所示: MATLAB GUI image

我想要实现的是MATLAB持续检查午夜,除了用户对界面进行任何更改时的暂停。因此,我在后台持续运行while循环,因为我需要检查它是否是午夜。如果是,我执行一些功能。包含此while循环的函数在检测到任何用户输入更改后调用,即在弹出菜单,按钮,文本框等的所有回调函数结束时调用。这就是我在while循环中有drawow的原因,因此,如果用户进行任何更改并希望运行某些计算,则会检测到该计算。完成计算后,我再次调用具有此while循环的函数。

问题是,即使我在我的while循环中使用drawow和暂停,有时候,并非总是如此,MATLAB仍然挂起我,GUI变得没有响应,并且无法识别任何用户输入。这是我的代码的while循环部分:

while 1
    pause(0.1);
    drawnow;
    pause(0.1);
    current_time=clock;
    if current_time(4)==0
        post_mortem;
    end
end

我知道上面的代码效率不高,因为它会在午夜时间连续调用post_mortem,但这不是我现在的问题。我的问题是它有时甚至在中午就挂断了我。有没有人对此有任何解决方案?在寻找以前类似问题的答案时,解决方案似乎是使用drawow和暂停,但这对我来说似乎也没有用。

任何指导都将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

由于MATLAB不是多线程的,因此使用while循环来连续检查某些内容(例如时间)会导致各种其他功能的阻塞。虽然drawnowpause可能对此有所帮助,但仍有一些潜在问题可能会出现。

更优雅和可靠的方法是使用timer对象以预先指定的间隔检查时间。这样,任何用户与GUI的交互都将自动进行注册,并且无需拨打pausedrawnow即可执行任何回调。

您可以在创建GUI后立即创建和启动计时器。

% Create the timer object
handles.mytimer = timer('ExecutionMode', 'FixedRate', ...
                        'Period', 1/5, ...
                        'BusyMode', 'drop', ...
                        'TimerFcn', @(s,e)timerCallback());

% Start the timer
start(handles.mytimer)

function timerCallback()
    % Callback that executes every time the timer ticks

    current_time = clock;
    if current_time(4) == 0
        post_mortem;
    end
end