gpt4 book ai didi

c++ - 从工作线程关闭定时器句柄

转载 作者:行者123 更新时间:2023-11-28 07:57:33 26 4
gpt4 key购买 nike

最好的提问方式是先举个例子:

这就是我在 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 参数传递以避免死锁。

关于c++ - 从工作线程关闭定时器句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com