MATLAB GUI挂起,尽管使用drawnow和pause



我有一个MATLAB GUI,看起来如下所示:MATLAB GUI图像

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

问题是,即使我在while循环中使用drawnow和pause,有时,并非总是,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,但这不是我现在的问题。我的问题是,它有时会挂掉,甚至在中午。有人能解决这个问题吗?在寻找以前类似问题的答案时,解决方案似乎是使用drawnow和pause,但这似乎也不适合我。

请指教。

谢谢

由于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

最新更新