Visual c++ win32中的定时器,c++;

Visual c++ win32中的定时器,c++;,visual-c++,winapi,Visual C++,Winapi,我有一个使用CreateTimerQueueTimer和DeleteTimerQueueTimer的timer类。我按预期接收对类对象的回调。当应用程序忙于绘制UI或进行密集渲染等时,如何确保计时器不会启动??我不关心高分辨率,只是当应用程序空闲时它必须启动 我正在使用以下命令创建计时器 BOOL timerCreated = ::CreateTimerQueueTimer(&mTimerRef, N

我有一个使用CreateTimerQueueTimer和DeleteTimerQueueTimer的timer类。我按预期接收对类对象的回调。当应用程序忙于绘制UI或进行密集渲染等时,如何确保计时器不会启动??我不关心高分辨率,只是当应用程序空闲时它必须启动

我正在使用以下命令创建计时器

BOOL timerCreated = ::CreateTimerQueueTimer(&mTimerRef,
                                            NULL,
                                            TimerCallback,
                                            (PVOID)(this),
                                            inFireDelay * 1000,
                                            inInterval * 1000,
                                            WT_EXECUTEINUITHREAD);
// using timer queues because i dont have access to a hWnd in this class.
抱歉,我无法仅使用MFC/.NET stictly win32

谢谢,
a中国。

这通常是不可能的。回调是在线程池线程上进行的,您不能挥动魔旗并询问“请不要开火”。即使这是可能的,这也是不可避免的竞争条件,线程可能已经启动,但还没有机会执行

您所能做的就是阻塞线程,在回调中使用关键部分或互斥。当UI线程“不空闲”时获取互斥是非常不实际的,您必须在消息循环中这样做。通常,您只想保护共享状态,即在UI线程和回调中访问的变量


如果您考虑这一点是因为您不希望在UI线程繁忙时回调占用CPU周期,那么请记住,现在几乎任何机器都至少有两个CPU核心。这个问题不需要解决。

WRT:
//使用计时器队列,因为我无法访问此类中的hWnd。

您不需要将hWnd传递给SetTimer—您只需注册一个被回调的计时器进程即可。WM_定时器消息的优先级较低,仅在没有其他消息挂起时由消息队列生成,因此您可以自动获得所需的行为


如果计时器消息正在绘制,那么设备驱动程序可能会产生很大的争用,以序列化线程池,但由于多核CPU是标准,在工作线程中执行计时器处理根本不必干扰UI线程。

谢谢,我想确保我的回调函数不会影响UI响应。