此问题与This
有关在运行while循环时,如何继续监听或查看pushbutton2,这样如果有推送我可以执行一些额外的操作?
答案 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
文本):
如果您通过点击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