2012-05-01 2 views
0

drawnowMATLAB : drawnow

원인은 업데이트 윈도우와 자녀를내는 기능을 가진 플러싱 이벤트 큐 및 시스템 이벤트 큐를 플러시합니다. 들어오는 이벤트 (예 : 마우스 또는 키 이벤트)로 생성 된 모든 콜백은 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 

를, 타이머 이벤트는 매초마다 발생합니다. 루프가 없으면 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'에서 (또는'help pause'에서?)'pause'는'drawnow'를 호출합니다. –

+0

나는 그것을 몰랐다. 매일 새로운 것을 배우십시오. – Pursuit