0

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

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

问题是,即使我在 while 循环中使用 drawow 和 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,但这不是我现在的问题。我的问题是,例如,即使在中午,它有时也会挂断我的电话。有人对此有任何解决方案吗?在寻找以前类似问题的答案时,解决方案似乎是使用drawow和pause,但这似乎对我也不起作用。

任何指导将不胜感激。

谢谢

4

1 回答 1

0

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

一种更优雅、更可靠的方法是使用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
于 2016-10-14T01:13:53.790 回答