0

関数drawnow

Figure ウィンドウとその子を更新し、システム イベント キューをフラッシュします。着信イベント (マウスまたはキー イベントなど) によって生成されたコールバックは、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) Figure ウィンドウを更新せずにキューをフラッシュする方法はありますか?

2) 「イベント キューをフラッシュする」と言うとき、「イベント キュー内のすべてを実行する」、「キュー内の次のものを実行し、他のすべてをキューから削除する」、またはまったく別の何かを意味しますか?

プログラムのバックグラウンドで発生している複数の個別のタイマーからの複数のコールバック関数があります。これらのコールバックのいずれかを実行しないことは、私にとって選択肢ではありません。明確にして、正しいことをしていることを確認したかっただけです。

4

2 に答える 2

2

1)私の知る限りではありません-少なくとも、キューをフラッシュする唯一の方法はを呼び出すことだと思いますdrawnow。「図ウィンドウの更新」の意味によっては、 drawow が望ましくない影響を与えるのを防ぐことができる場合があります (たとえば、 drawow を呼び出す前にデータ ソースを削除するなど)。

2)今はこれをテストできませんが、以前の使用方法と上記の説明に基づいて、「キュー内のすべてを実行する」と確信しています。

while 1; drawnowもう 1 つ確信が持てないのは、必要があるかどうかということstart(t)です。drawnowwhileループ内など、他のことをしている場合にのみ必要だと思いました。

于 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 に答える