강께르의 개발일지

[WinAPI] SetTimer와 KillTimer 본문

프로그래밍/WinAPI

[WinAPI] SetTimer와 KillTimer

강께르 2021. 6. 25. 17:29

1. 타이머란?

- 프로그램은 실행 중에 사용자로부터 입력을 받게 되면 그 입력에 따른 메시지를 처리하고 그것을 화면에 보여주는 과정을 거친다.

- 만약 사용자로부터 키보드나 마우스와 같은 입력이 없을 경우엔 프로그램은 사용자의 동작을 통해 발생하는 메시지가 없어 화면이 멈추는 현상이 일어날 것이다.

- 이 경우를 위해 다른 동작에 의한 메시지가 없어도 메시지를 발생하는 것이 필요할텐데, 그것이 타이머 메시지이다.

- 타이머 메시지는 일정한 시간 간격을 두고 계속 발생하는 메시지를 말한다.

- 주기적으로 같은 동작을 반복해야 하거나 여러번 나누어 해야 할 일을 할 때, 이 메세지를 이용한다.

 

2. SetTimer

- SetTimer는 타이머 생성 함수이다. 이를 통해 원하는 동작을 일정한 간격의 시간마다 수행하게 될 것이다.

- 함수 원형은 다음과 같다.

UINT_PTR SetTimer(
    HWND hWnd, 
    UINT nIDEvent, 
    UINT uElapse, 
    TIMERPROC lpTimerFunc
);

- hWnd : 타이머 메시지를 받을 윈도우이다. 보통 WndProc의 매개변수로 전달되는 hWnd를 그대로 써 주면 된다.

- nIDEvent : 타이머의 번호를 지정한다. 하나의 타이머만 사용할 경우, 1을 주면 된다. 여러 개의 타이머를 사용할 경우엔 nIDEvent에 이미 사용한 번호가 겹치지 않게 번호를 부여하면 된다. 이는 WM_TIMER 메시지에서 타이머를 구분하는 기준이 된다.

- uElapase는 1/1000초 단위의 타이머 주기를 설정한다. 이 값이 1000이면 1초라는 이야기이고, 타이머 메시지를 1초에 한번씩 hWnd가 핸들하는 윈도우로 보내지게 될 것이다.

- lpTimerFunc은 타이머 메시지가 발생할 때마다 호출될 함수를 지정한다. 사용하지 않을 경우 NULL로 설정하며 WM_TIMER 메시지만 발생하여 처리하게 될 것이다.

- hWnd에 전달하는 WM_TIMER는 wParam으로 타이머 ID를 전달한다. lParam으로 타이머 메시지를 발생하면 호출될 함수의 번지가 전달된다.

 

- SetTimer의 원형을 보고 이해한 것은 다음과 같다.

- SetTimer를 호출하여 매개변수를 전달하는데 그 매개변수에 따라서 지정한 시간 간격마다 지정된 타이머 번호에 해당하는 타이머가 지정한 함수를 호출하거나 WM_TIMER 메시지를 발생하여 hWnd로 전달하여 처리한다. 

 

3. KillTimer

- 타이머를 시스템 전역 자원이다. 타이머를 다 쓰고 해제하지 않은 상태에서 프로그램을 종료하면 계속 남아 있게 된다.

- 그래서 프로그램이 종료될 때, 프로그래머가 설정한 타이머를 직접 해제하도록 해야 한다.

- 그렇지 않을 경우, 타이머는 계속 남아 CPU를 주기적으로 차지하게 되어 시스템 성능을 떨어뜨리는 원인이 된다.

BOOL KillTimer(HWND hWnd, UINT uIDEvent);

- hWnd : 해제하고 하는 타이머를 갖고 있는 윈도우 핸들을 매개변수로 한다.

- uIDEvent : SetTimer 호출 시 매개변수로 지정했던 타이머 번호를 매개변수로 한다.

 

- KillTimer의 원형을 보고 이해한 것은 다음과 같다.

- KillTimer를 호출하여 할당한 타이머를 해제할 것이다. 할당한 타이머가 있는 윈도우의 핸들러로부터 해제하고자 하는 타이머의 번호를 통해 타이머를 해제한다.

 

 

출처 :

'프로그래밍 > WinAPI' 카테고리의 다른 글

[WinAPI] 게임에서의 메시지 처리  (0) 2021.06.27