2012-05-01 19 views
0

功能drawnowMATLAB:沖洗事件隊列的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)當我們說「刷新事件隊列」時,我們的意思是「在事件隊列中執行所有事情」,「執行隊列中的下一步並將所有其他事情排除在隊列之外」,或者完全是其他的東西?

我已經從多個獨立的定時器在我的程序的背景下發生的多次回調函數。沒有執行這些回調之一不是我的選擇。我只是想澄清並確保我做的是正確的事情。

回答

2

1)據我所知 - 至少,我相信刷新隊列的唯一方法是調用drawnow。根據「更新數字窗口」的含義,您可能會阻止drawnow產生不良影響(例如,在調用drawnow之前刪除數據源)。

2)我現在不能測試此權利,但基於我如何使用它之前,你上面給出的描述,我敢肯定這是「執行隊列中的一切。」

我不確定的另一件事是您是否需要while 1; drawnow - 如果您只是在start(t)之後結束腳本,那麼事件並不像您期望的那樣工作?我認爲drawnow只有在你正在做一些其他的事情時纔是必要的,例如在while循環中。

+0

這是一個例子。我會在'while'循環中做很多其他的事情。我只是想演示如果沒有'drawnow',定時器回調從不執行。 –

+0

好的,那麼是的,把'drawnow'放在那個循環中可能是正確的解決方案。 – Richante

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) 
+0

我也嘗試了這一點,實際上在'幫助drawnow'(或者說是'幫助pause'?),它說,'pause'調用'drawnow'。 –

+0

我沒有意識到這一點。每天學些新東西。 – Pursuit