关闭计时器从工作线程处理

Closing timers handle from the working thread

本文关键字:线程 处理 工作 计时器      更新时间:2023-10-16

提问的最佳方式是首先展示一个示例:

这就是我在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错误,我对此不太关心。一旦回调线程被自动签名,它们的终止将被执行。

我说得对吗?谢谢

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