函数drawnow
导致图窗口及其子窗口更新,并刷新系统事件队列。在
drawnow
返回之前调度由传入事件(例如,鼠标或键事件)生成的任何回调。
我有以下脚本:
clear all;
clc;
t = timer;
set(t, 'Period', 1);
set(t, 'ExecutionMode', 'fixedSpacing');
set(t, 'TimerFcn', @(event, data) disp('Timer rollover!'));
start(t);
while(1)
%# do something interesting
drawnow;
end
在drawnow
到位的情况下,计时器事件将每秒发生一次。没有它,就不会发生回调函数,因为while
循环是“阻塞”。
我的问题:
1)有没有办法在不更新数字窗口的情况下刷新队列?
2)当我们说“刷新事件队列”时,我们的意思是“执行事件队列中的所有内容”,“执行队列中的下一步并将所有其他内容从队列中删除”,或完全不同的其他内容?< / p>
我在程序的后台发生了多个独立计时器的多个回调函数。没有执行其中一个回调对我来说不是一个选择。我只是想澄清并确保我做的是正确的事。
答案 0 :(得分:2)
1)据我所知 - 至少,我认为刷新队列的唯一方法是调用drawnow
。根据“更新图形窗口”的含义,您可以防止拉丝产生不良影响(例如,在调用drawow之前删除数据源)。
2)我现在无法对此进行测试,但根据我之前的使用方法以及上面给出的描述,我很确定它是“执行队列中的所有内容”。
我不确定的另一件事是你是否需要while 1; drawnow
- 如果你只是在start(t)
之后结束脚本,那么事件是否正常工作?我认为drawnow
只有在做其他事情时才是必要的,例如在while循环中。
答案 1 :(得分:1)
如果你还在循环中放置一个小暂停,那也可以为计时器腾出一些时间。例如pause(0.001)
。一些例子:
start(t); while(1); end; %No timer events occur
start(t); while(1); pause(0.001); end %Timer events occur
start(t); while(1); drawnow; end %Timer events occur (your original example)
start(t); while(1); pause(0); end %No timer events (just thought I'd check)