본문 바로가기

Application Dev./C++/MFC

멀티미디어 타이머 이용 방법

멀티미디어 타이머 이용 방법

WM_TIMER 메시지를 이용한 방법이나 멀티미디어 타이머를 이용한 방법에서는 반복주기를 msec 단위로 지정해 줄 수가 있습니다. 그러나, WM_TIMER를 이용한 방법에서는 사실상 정확한 반복주기를 유지한다는 것이 불가능하여 수십 msec만큼의 정밀도밖에 가지지 못합니다. 반면에, 이 문서에서 설명할 멀티미디어 타이머는 최대 1msec까지 그 정밀도가 보장됩니다. 고정된 시간간격의 유지가 필수적인 애플리케이션에 유용한 방법입니다.

2-1. 타이머 생성 : timeSetEvent 함수 이용

MMRESULT timeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent);

 

매개 변수
uDelay : 딜레이 시간, mili second 단위
uResolution : 해상도, mili second 단위, 작은 값일수록 해상도가 높음. 0이면, 가능한 최대의 해상도 사용. 되도록 큰 값을 줘서 시스템의 부하를 줄일 필요가 있음

lpTimeProc : 콜백 함수 포인터

/* 참고
콜백 함수의 프로토타입 : void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
매개 변수
uID : 타이머 ID, timeSetEvent() 함수가 돌려주는 값
uMsg : 사용하지 않음
dwUser : timeSetEvent()의 dwUser값
dw1, dw2 : 사용하지 않음
*/

dwUser : 콜백 함수에 전달하는 값
fuEvent : 타이머 타입. 한 번만 실행할 경우에는 TIME_ONESHOT으로, 반복적으로 실행할 경우에는 TIME_PERIODIC로 설정, 그외 몇 가지 타입이 더 있음.

 

리턴값 : 리턴값의 자료형이 MMRESULT으로서, UINT와 같음. 0이면 타이머 생성 실패, 0이 아니면 생성된 타이머 ID
설명 : uDelay의 타이머 생성. lpTimeProc가 가리키는 콜백 함수가 호출됨
헤더 파일 : mmsystem.h (이 헤더 파일과 아래의 라이브러리 파일은 timeSetEvent()와 timeKillEvent()를 사용하기 위해 필요함)
라이브러리 파일 : winmm.lib

사용 예)
1) 해상도 1, 딜레이 시간 1초로 TimerProc()를 반복 실행하도록 설정하는 예
m_uTimerID = timeSetEvent(1000, 1, TimerProc, 0, TIME_PERIODIC);

2-2. 타이머 종료 : timeKillEvent 함수 이용

MMRESULT timeKillEvent(UINT uTimerID);

매개 변수
uTimerID : 종료시키고자 하는 타이머 ID

리턴값 : TIMERR_NOERROR라면 성공, TIMERR_INVALPARAM이면 명시한 타이머가 없음을 뜻함

설명 : uTimerID로 명시한 타이머를 종료시킴. uTimerID는 timeSetEvent()의 리턴값임.

사용 예)
1) 2-1. timeSetEvent() 함수의 "사용 예"에서, 타이머의 ID를 가지고 있는 변수 m_uTimerID를 이용해 타이머를 종료시키는 예
timeKillEvent(m_uTimerID);