我有一个无窗口的计时器(无WM_TIMER),它在给定时间段内仅触发一次回调函数。它被实现为SetTimer()/KillTimer()。时间段足够小:100-300毫秒。

这样便宜吗(我是说性能),足以在每个如此短的时间间隔内调用SetTimer()/KillTimer()对?

如果我有100个此类计时器定期调用SetTimer()/KillTimer()怎么办?系统中可以同时存在多少个窗口计时器对象?

就是那个问题:
使用一堆这样的计时器对象,并依靠良好的Windows计时器实现,或创建一个Windows计时器对象,该计时器每隔30毫秒进行一次滴答,然后为所有自定义的100-300毫秒一次性计时器进行订阅。

谢谢

最佳答案

当您尝试使用计时器消息时,它们的问题在于它们是低优先级消息。实际上,它们是伪造的消息。计时器与基础内核计时器对象相关联-当消息循环检测到发出了内核计时器信号时,它仅使用标记来标记当前线程消息队列,该标志指示对GetMessage的下一次调用-当没有其他要处理的消息时-应该综合及时发送WM_TIMER消息并将其返回。
对于潜在的大量计时器对象,系统显然不会为所有计时器均等地发信号通知计时器消息并不明显,并且任何系统负载都可以长时间完全阻止WM_TIMER消息的生成。
如果您控制着消息循环,则可以使用维护自己的计时器事件列表(以及应该发生时的GetTickCount时间戳)和MSGWaitForMultipleObject-而不是GetMessage来等待消息。使用dwTimeout参数提供最小的间隔-从现在开始-直到下一个定时器发出信号为止。因此,每次有计时器要处理时,它将从等待消息中返回。
和/或您可以在带有MSGWaitForMultipleObjects的GUI线程上或仅在工作线程上使用waitable timers直接访问较低级别的计时功能。

10-04 14:48