继续监听来自外部函数的按钮{不同的 .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
此问题与
在运行 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