2012-09-12 3 views
0

가장 좋은 방법을 처리 :폐쇄 타이머 작업 스레드에서 최초의 예를 보여주고있는 질문을하는

내가 C++에서 타이머 만드는 방법이 있습니다 : 다음 콜백이 트리거되면

 if (FALSE == CreateTimerQueueTimer(&m_hSampleStarvationTimer, 
              m_hSampleStarvationTimerQueue, 
              (WAITORTIMERCALLBACK)TsSampleStarvationTimeBomb_Static, 
              (LPVOID)this, 
              dwDueTime, 
              0, 
              WT_EXECUTEONLYONCE)) 

을 (TsSampleStarvationTimeBomb_Static), 나는 특정 스레드 내에서 큐 핸들과 타이머 핸들을 모두 죽이려고합니다.

void CALLBACK CCaptureChannel::TsSampleStarvationTimeBomb_Static(LPVOID lpArg, BOOLEAN TimerOrWaitFired) 
    { 
     HRESULT hr; 
     BOOL bHandleDeletion   = FALSE; 
     CCaptureChannel* pCaptureChannel = (CCaptureChannel*)lpArg; 

     ATLASSERT(pCaptureChannel); 

     bHandleDeletion = DeleteTimerQueueTimer(pCaptureChannel->m_hSampleStarvationTimerQueue, pCaptureChannel->m_hSampleStarvationTimer, NULL); 
     bHandleDeletion = DeleteTimerQueue(pCaptureChannel->m_hSampleStarvationTimerQueue); 

제 질문은 유효합니까? MSDN을 통해 다음 삭제 함수가 너무 많이 걱정해서는 안되는/o 오류를 반환 할 수 있다고 읽었습니다. 콜백 스레드가 자동으로 로그인되면 종료됩니다.

맞습니까? 감사합니다.

+0

SDK 문서는이를 수행하는 교착 상태에 대해 경고합니다. 대신 DeleteTimerQueueEx()를 고려하십시오. –

+0

메신저 확실치 않습니다. 일단 콜백 함수 (async)가 코드 실행을 마쳤 으면 타이머 핸들은 어떻게 될까요? 자동으로 출시 되나요? 또는 그것을 삭제하려면 삭제/취소 함수를 호출해야합니까? –

답변

1

DeleteTimerQueueEx는 모든 타이머 콜백이 완료되는 즉시 대기열과 관련된 모든 타이머를 취소하고 삭제하므로 DeleteTimerQueueEx를 ​​한 번만 호출하면 충분합니다. DeleteTimerQueueTimer를 호출 할 필요가 없습니다. 현재 코드에서와 같이 콜백 내에서 호출하면 교착 상태를 피하기 위해 CompletionEvent 매개 변수로 NULL을 전달해야합니다.

+0

실수하지 않으면, DeleteTimerQueueEx도 TimerQueue를 취소하고 삭제합니다. –

+0

예, 이름에서 알 수 있습니다. 따라서 DeleteTimerQueueEx에 대한 한 번만 호출하면됩니다. –

관련 문제