timesetevent 예제

이전 장의 예제의 멀티미디어 타이머 버전: 위에 표시된 예제는 표준 Win32 타이머의 처리와 유사한 방식으로 작성되었습니다. 그러나 실제로는 멀티미디어 타이머의 기능을 별도의 클래스로 래핑하고 동일한 작업을 수행하는 것이 좋습니다. 우리는 반 시간마다 새로운 메일에 대한 우리의받은 편지함을 확인해야하는 경우, Win32 타이머는 우리가 원하는 전부입니다. 그러나 보다 정확한 시간 측정(경과 시간 1초 미만)을 위해 이 타이머는 거의 해결책이 아닙니다. 주된 이유는 타이머가 WM_TIMER 메시지를 메시지 큐에 게시하므로 이 메시지가 언제 처리될지 확신할 수 없습니다. 이제 lpTimerFunc 설정이이 문제에 대한 해결책이라고 생각할 수 있지만 그렇지 않습니다. lpTimerFunc을 지정하는 경우 기본 창 프로시저는 WM_TIMER을 처리하는 경우에만 호출합니다. 따라서 WM_TIMER이 처리될 때까지 기다립니다. 응용 프로그램에서 타이머가 필요하다고 결정하면 다른 타이머 변형 중하나를 선택하는 것이 그렇게 어렵지 않아야합니다. 다음 간단한 규칙을 따르십시오. uDelay 이벤트 지연(밀리초)입니다. 이 값이 타이머에서 지원하는 최소 및 최대 이벤트 지연 범위에 있지 않으면 함수가 오류를 반환합니다.

타이머 해상도를 설정하는 것을 기억하십니까? 글쎄, 우리는 타이머를 완료 한 후, 우리는 에 대한 호출과 타이머 해상도를 “재설정”해야 : 내가 전에 언급 한 바와 같이, 멀티미디어 타이머는 자신의 스레드에서 실행됩니다. 마지막으로, 여기에 대기 타이머를 중지 하는 기능: 프로젝트에서 멀티미디어 타이머를 사용 하려면, Mmsystem.h를 포함 해야 합니다., Winmm.lib와 연결. Win32 타이머 이벤트 처리는 UI 스레드에서 수행됩니다. 이 사실의 좋은 측면은 타이머 이벤트 처리기에서 데이터를 손상시키는 것에 대해 걱정할 필요가 없다는 것입니다. 반대로 WM_TIMER 처리기에서 보낸 시간은 UI의 응답성에 영향을 미칩니다. 당신이 날 믿지 않는 경우에, 같은 것을 호출해 ::Sleep (10000); CTimersDlg 내에서::OnTimer(). TIME_KILL_SYNCHRONOUS 및 TIME_CALLBACK_FUNCTION 플래그를 사용 하 여 이벤트를 만들면 timeKillEvent 함수가 호출 된 후 이벤트가 발생 하지 않습니다. 콜백 함수는 APC로 큐에 대기됩니다.

함수가 경고 가능한 대기 작업을 수행하는 경우 재진입 문제를 해결해야 합니다. 완료 루틴의 실행을 사용 하려면 스레드 경고 가능한 상태 (SleepEx를 실행), WaitForSingleObjectEx() – WaitForMultipleObjectsEx(), MsgWaitForMultipleObjectsEx() 및 SignalObjectAndWait() 함수)에 있어야 합니다. 실제로 이것은 대기 가능한 타이머를 사용하는 동안 주 스레드가 차단된다는 것을 의미합니다. fuEvent의 다른 값에 대해 lpTimeProc 매개 변수는 LPTIMECALLBACK 형식의 콜백 함수에 대한 포인터입니다. 멀티미디어 타이머는 메시지 큐에 메시지를 게시하지 않는 고해상도 타이머입니다. 대신 지정된 콜백 함수를 별도의 스레드에서 직접 호출합니다(또는 특정 이벤트를 설정하거나 펄스할 수 있지만 이 옵션은 이 문서에서 다루지 않습니다). 따라서, 그것은 표준 Win32 타이머보다 더 정확하지만, 또한 더 위험하다. 여기서는 짧은 경과 시간을 지정하는 경우 사용자를 보호하기 위한 메시지 큐가 없습니다.

CWnd에서 Win32 타이머의 일반적인 사용 – 파생 클래스는 다음과 같습니다 : 어떤 시점에서, 우리는 타이머의 “똑딱”을 중지 할 것입니다.