Computer/C, CPP, MFC

timeSetEvent 와 친구들

hwaya. 2015. 6. 2. 15:04
반응형

이틀째, 프로그램에서 데이터를 보내주는걸 확인하는 부분이 있는데 

(사실 이부분도 몰랐다..내가 만든게 아니니ㅜㅜ)

계속 무한루프 걸렸는지 '응답없음' 으로

도도한 녀석 같으니 대꾸가~ 없어!!!!!!!!

흥4


이리보고 저리보고 이부분일꺼라고 예상은 되었다..


WaitForSingleObject


예상은 했지만, 

역시나... 이녀석과 같이 놀고 있는 녀석이 범인이였다.

timeSetEvent

이놈옴~!!!


재현이 1시간이상 걸리니.. ㅜㅜ

지루해~


WaitForSingleObject 에서 받아야되는데 받지를 못하니..

 참고: 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); 하면됩니다.


 

 

반응형