继续从外部函数{不同的.m文件}中听按钮

时间:2016-02-12 11:50:05

标签: matlab matlab-guide

此问题与This

有关

在运行while循环时,如何继续监听或查看pushbutton2,这样如果有推送我可以执行一些额外的操作?

1 个答案:

答案 0 :(得分:2)

Matlab是单线程,即当它执行某些代码(即你的while循环)时,它无法处理任何其他事件(即你的pushbutton)直到代码完成了。

请看下面的简单示例来证明这一点:

%% --- GUI creation
function [] = mygui()
%[
    fig = figure(666);
    clf;
    uicontrol('Parent', fig, 'Units', 'Normalized', 'Position', [0.2 0.4 0.7 0.1], 'String', 'Start script', 'Callback', @onStartScript);
    uicontrol('Parent', fig, 'Units', 'Normalized', 'Position', [0.2 0.2 0.7 0.1], 'String', 'Say hello', 'Callback', @onSayHello);
%]
end

%% --- Event handlers
function [] = onStartScript(sender, args)
%[
    for i = 1:10,
        disp(i);
        pinv(rand(1200, 1200)); % Simulates long processing           
    end
%]
end
function [] = onSayHello(sender, args)
%[
    disp('Hello');
%]
end

它创建了一个带有两个按钮的简单图形(一个用于启动循环,另一个用于在命令窗口中显示Hello文本):

enter image description here

如果您通过点击Start script按钮然后点击Say hello按钮来运行此代码,您会看到Hello文字仅在循环完成时显示:

>> mygui
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
 Hello
 Hello
 Hello
 Hello
 Hello

这里发生的事情是,当操作系统仍然在其消息队列中堆叠消息以指示已按下Say hello按钮时,matlab被锁定执行您的代码。只有当matlab返回空闲状态时,它才能处理这些消息/事件。

要强制maltab处理它的消息队列,请在循环期间添加对drawnow的调用:

function [] = onStartScript(sender, args)
%[
    for i = 1:10,
        disp(i);
        pinv(rand(1200, 1200)); % Simulates long processing
        drawnow; % FORCE PROCESSING ANY PENDING GRAPHICAL EVENTS
    end
%]
end

现在,您将看到在循环执行时处理GUI事件:

>> mygui
     1
     2
 Hello
 Hello
     3
     4
     5
 Hello
     6
     7
 Hello
 Hello
     8
     9
    10