timeSetEvent 와 친구들
이틀째, 프로그램에서 데이터를 보내주는걸 확인하는 부분이 있는데
(사실 이부분도 몰랐다..내가 만든게 아니니ㅜㅜ)
계속 무한루프 걸렸는지 '응답없음' 으로
도도한 녀석 같으니 대꾸가~ 없어!!!!!!!!
이리보고 저리보고 이부분일꺼라고 예상은 되었다..
WaitForSingleObject
예상은 했지만,
역시나... 이녀석과 같이 놀고 있는 녀석이 범인이였다.
timeSetEvent
이놈옴~!!!
재현이 1시간이상 걸리니.. ㅜㅜ
지루해~
WaitForSingleObject 에서 받아야되는데 받지를 못하니..
자! 그럼 timeSetEvent에 대해서 알아보자.
멀티미디어 타이머로 아주아주 높은 정확도의 타이머이다.
일정한 주기마다 표시된 콜백 함수나 이벤트를 호출 한다.
함수 원형은
WINMMAPI MMRESULT WINAPI timeSetEvent( __in UINT uDelay, __in UINT uResolution,
__in LPTIMECALLBACK fptc, __in DWORD_PTR dwUser, __in UINT fuEvent);
매개변수는,
첫번째, uDelay
밀리초(MilliSecond, 1/1000 초) 단위의 딜레이시간
이벤트 발생 주기를 명시합니다.
만약 발생 주기가 타이머에서 제공가능한 범위가 아닐 경우 에러를 발생.
두번째, uResolution
밀리초 단위의 타이머 해상도
해상도가 0 이면 주기 가능한 최고로 정확하게 발생해야함
그러나 해상도에 0 을 설정하면 시스템에 부하를 주기때문에 적절하게 사용하여 부하를 줄이도록 하는 것이 좋다.
타이머 해상도의 최소값과 최대값은 timeGetDevCaps() 함수로 얻을 수 있다.
TIMECAPS timecaps; // 구조체 선언
timeGetDevCaps(&timecaps, sizeof(TIMECAPS));
timecaps.wPeriodMin // 최소
timecaps.wPeriodMax // 최대
세번째, lpTimeProc
호출할 콜백 함수의 포인터를 명시,
만약 fuEvent 가 TIME_CALLBACK_EVENT_SET 이나 TIME_CALLBACK_EVENT_PULSE 플래그로 명시되어 있다면, 이 매개변수는 이벤트 핸들로 판단하여 SetEvent() 나 PulseEvent() 함수를 호출하여 이벤트를 발생 시킵니다.
콜백 함수의 원형은 아래와 같으며 아래에 주기마다 실행할 루틴을 적어주면 됩니다.
// 일정 주기가 되는 시점마다 호출될 콜백 함수
// m_nTimerID : timeSetEvent 함수의 반환값으로 부여받은 타이머의 ID
// uMsg, dw1, dw2 : 내부적으로 예약된 것이므로 사용하지 않는다.
// dwUser : timeSetEvent 함수를 호출할 때 dwUser 매개 변수에 입력한 사용자 데이터이다.
void CALLBACK TimerProc(UINT m_nTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
// 원하는 작업을 명시한다.
}
네번째, dwUser
콜백 함수의 매개변수로 사용될 데이터.
현재 윈도우의 포인터를 설정하면 유용하게 사용할 수 있다.
다섯번째, fuEvent
타이머 이벤트의 타입을 명시
발생빈도중에 하나의 값과 lpTimeProc 중에 하나의 값을 조합하여 사용
발생빈도는 TIMER_ONESHOT 가 기본 값이고, lpTimeProc 는 TIME_CALLBACK_FUNCTION 가 기본 값
이므로 기본 값이 아닌 값을 설정할 경우 반드시 명시적으로 설정해주어야 한다.
발생 빈도
TIMER_ONESHOT
이벤트 발생 또는 콜백 함수 호출이 한번만 발생한다.
TIME_PERIODIC
uDelay 주기로 타이머가 해제될 때까지 발생한다.
lpTimeProc
TIME_CALLBACK_FUNCTION
주기가 만료될 때 lpTimerProc 의 콜백함수를 호출합니다.
TIME_CALLBACK_EVENT_SET
주기가 만료될 때 SetEvent 함수를 호출하여 lpTimeProc 에 있는 이벤트 핸들을 발생시킵니다.
이 값을 설정하므로써 이벤트가 발생되기 때문에 dwUser 매개 변수는 무시됩니다.
TIME_CALLBACK_EVENT_PULSE
주기가 만료될 때 PulseEvent 함수를 호출하여 lpTimerProc 에 있는 이벤트 핸들을 발생
시킵니다. 이 값을 설정하므로써 이벤트가 발생되기 때문에 dwUser 매개 변수는 무시됩니다.
없애고 싶을때,
timeKillEvent (UINT uTimerID); 하면됩니다.
'Computer > C, CPP, MFC' 카테고리의 다른 글
ReadFile() (0) | 2015.12.04 |
---|---|
SetFilePointer() (0) | 2015.12.04 |
프로그램 종료 (0) | 2015.10.13 |
하위폴더까지 전체 복사하기 (0) | 2015.10.02 |
윈도우 버전 알아보기 (0) | 2015.10.02 |
Windows Styles (0) | 2015.06.15 |
PeekMessage (0) | 2014.03.26 |
Printf 함수에 대해서 알아보자 (0) | 2011.07.13 |