继续监听来自外部函数的按钮{不同的 .m 文件}

Keep listening to the pushbutton from an external function{Different .m file}

此问题与

相关

在运行 while 循环中,我怎样才能一直监听或查看pushbutton2,以便在有push 时执行一些额外的操作?

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

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

如果您通过单击 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 returns 进入空闲状态时,它才能处理这些 messages/events.

要强制 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