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

MATLAB GUI hangs up despite using drawnow and pause

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

我想要实现的是 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