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);

私の質問は:それは有効ですか?次の削除関数がI/Oエラーを返す可能性があることを、MSDNで読みましたが、あまり気にする必要はありません。コールバックスレッドが自動的に署名されると、それらの終了が実行されます。

私は正しいですか?ありがとう!

4

1 に答える 1

2

DeleteTimerQueueExは、すべてのタイマーコールバックが完了するとすぐに、キューに関連付けられているすべてのタイマーをキャンセルして削除するため、DeleteTimerQueueExを1回呼び出すだけで十分です。DeleteTimerQueueTimerを呼び出す必要はありません。現在コードにあるようにコールバック内から呼び出す場合は、デッドロックを回避するためにCompletionEventパラメーターとしてNULLを渡す必要があります。

于 2012-09-12T17:12:24.027 に答える