1

提出问题的最好方法是先举一个例子:

这就是我在 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 上阅读了以下删除函数可能会返回 i/o 错误,这不应该让我太担心。一旦回调线程被签名,它们的终止将自动执行。

我对吗?谢谢!

4

1 回答 1

2

一旦所有计时器回调完成,DeleteTimerQueueEx 将取消并删除与队列关联的所有计时器,因此对 DeleteTimerQueueEx 的一次调用就足够了。您不需要调用 DeleteTimerQueueTimer。如果您像当前在代码中那样从回调中调用它,则必须将 NULL 作为 CompletionEvent 参数传递以避免死锁。

于 2012-09-12T17:12:24.027 回答