Timer 의 사용법

Download Report

Transcript Timer 의 사용법

Timer 사용법
 주기적인 작업이 필요할 때
• 빨강 사각형 1초 표시  파란 사각형 1초 표시  빨강 사각형 1초 표시  …
• 동작은 하지만 절대 이렇게 해서는 안 되는 프로그램
OnDraw(..) {
while ( 1 ) {
빨강 사각형 그린다
1초간 기다린다.
파란 사각형 그린다.
1초간 기다린다.
}
}
 OnDraw 를 실행한다고 다른 메시지는 처리하지 못 함.
 해결책 : Timer의 사용
• Windows에게 시간을 알려 달라고 부탁
프로그래밍 응용 #9
1
Timer 의 사용법
처리 routine
 WM_TIMER 메시지
OnTimer(…)
Windows
Your Program
OnTimer(..) {
if ( a == 0 ) {
주기적으로 WM_TIMER 메시지 발생
빨강 사각형 그림
a = 1;
• 주기는 지정 가능 (1ms 단위로)
}
else {
파란 사각형 그림
a=0
}
}
전역변수 a 사용
프로그래밍 응용 #9
2
사각형 그리는 프로그램 예제
 다음과 같은 사각형 그리는 routine이 있을 때, 프로그램을 완성하라.
• void draw_rect(CPoint p, BYTE red, BYTE green, BYTE blue);
OnTimer(..) {
OnDraw(..) {
if ( a == 0 ) {
a = 1;
}
else {
a=0
}
}
}
프로그래밍 응용 #9
3
Timer 관련 함수들
 Timer와 관련된 함수들
• SetTimer(…) : Timer의 ID 및 주기 설정
• OnTimer(…) : WM_TIMER 처리 routine
• KillTimer(…) : Timer를 더 이상 사용 안 함
 Windows관련 함수 (CView class)
• OnInitialUpdate() : Document class가 ready 되었고, 뷰 윈도우가 최초로 화면에
나타나기 바로 직전에 호출됨
- 초기화를 여기에서 할 수 있음
• OnDestroy() : 뷰원도우가 없어질 때 호출됨
- 각종 마무리 작업을 여기에서 하면 됨
프로그래밍 응용 #9
4
SetTimer 함수
 SetTimer
• SetTimer(UINT nIDEvent, UINT nElapse, void CALLBACK EXPORT *lpfnTimer)
- nIDEvent : Timer의 ID (0, 1, 2, ….)
- nElapse : Timer의 주기 (단위 ms, 이 숫자가 100이면 100ms 마다
WM_TIMER 메시지가 발생됨)
- lpfnTimer : WM_TIMER 메시지 발생시 실행할 함수의 이름. NULL로 두면
OnTimer 함수가 실행됨
 예제
SetTimer(0,1000,NULL);
SetTimer(0,1000,NULL);
SetTimer(0,500,NULL);
프로그래밍 응용 #9
10초간 WM_TIMER 메시지는
몇 번 발생되는가?
10초간 WM_TIMER 메시지는
몇 번 발생되는가?
5
Timer 관련 프로그램
 SetTimer() 및 WM_TIMER 메시지 처리 routine OnTimer
int count;
a는 얼마?
OnTimer(UINT nIDEvent) {
int a;
OnInitialUpdate() {
a = nIDEvent;
count = 0;
++count;
SetTimer(0,100,NULL);
}
if ( count == 10 )
KillTimer(0);
Timer 주기 : 100 ms
}
Timer ID (0, 1, 2, ..)
프로그래밍 응용 #9
6
Timer 예제 1
 count0 및 count1의 최종값은 어떻게 될까?
int count0, count1;
OnInitialUpdate() {
SetTimer(0,100,NULL);
SetTimer(1,200,NULL);
OnTimer(UINT nIDEvent) {
if ( nIDEvent == 0 ) {
++count0;
}
else if ( nIDEvent == 1 ) {
++count1;
}
count0 = 0;
if ( count0 == 10 ) {
KillTimer(0);
KillTimer(1);
}
count1 = 0;
}
}
프로그래밍 응용 #9
7
Timer 예제 2
 다음 프로그램을 실행하면 어떤 일이 일어나는가?
• draw_rect는 사각형을 그리는 함수임
CPoint s, e;
OnTimer(UINT nIDEvent) {
s.x = 10; s.y = 10;
if (nIDEvent == 0 ) {
e.x = 20; e.y = 20;
e.x = e.x + 10;
e.y = e.y + 10;
OnInitialUpdate() {
Invalidate();
SetTimer(0,1000,NULL);
if ( e.x > 100 )
}
KillTimer(0);
}
OnDraw() {
draw_rect(s,e);
}
}
프로그래밍 응용 #9
8