Закрывающая ручка таймера из рабочего потока

Лучший способ задать вопрос — сначала показать пример:

Вот как я создаю таймер в 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, что следующие функции удаления могут возвращать ошибки ввода-вывода, которые не должны беспокоить меня слишком сильно. их завершение будет выполнено, как только поток обратного вызова автоматически станет подписанным.

я прав?
Спасибо!

0

Решение

DeleteTimerQueueEx отменит и удалит все таймеры, связанные с очередью, как только завершатся все обратные вызовы таймера, поэтому будет достаточно одного вызова DeleteTimerQueueEx. Вам не нужен вызов DeleteTimerQueueTimer. Если вы вызываете его из обратного вызова, как в данный момент в вашем коде, вы должны передать NULL в качестве параметра CompletionEvent, чтобы избежать взаимоблокировки.

1

Другие решения

Других решений пока нет …