0

功能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)当我们说“刷新事件队列”时,我们的意思是“执行事件队列中的所有内容”,“执行队列中的下一个并将其他所有内容从队列中删除”,还是完全其他的意思?

我的程序后台发生了来自多个单独计时器的多个回调函数。不执行这些回调之一对我来说不是一个选择。我只是想澄清并确保我做的是正确的事情。

4

2 回答 2

2

1)据我所知,至少,我相信刷新队列的唯一方法是调用drawnow. 根据您所说的“更新图形窗口”的含义,您可能能够防止drawow 产生不良影响(例如,在调用drawow 之前删除数据源)。

2)我现在无法测试这个,但根据我之前的使用方式,以及你上面给出的描述,我很确定它是“执行队列中的所有内容”。

我不确定的另一件事是您是否需要while 1; drawnow- 如果您只是在之后结束脚本,事件不会像您期望的那样工作start(t)吗?我认为drawnow只有在你正在做一些其他事情时才有必要,例如在 while 循环中。

于 2012-05-01T21:45:04.043 回答
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)
于 2012-05-02T03:48:59.430 回答