gpt4 book ai didi

c++ - SetTimer() 陷阱

转载 作者:可可西里 更新时间:2023-11-01 13:11:53 31 4
gpt4 key购买 nike

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

对于每个如此短的时间间隔调用 SetTimer()/KillTimer() 对是否足够便宜(我的意思是性能)?

如果我有 100 个周期性调用 SetTimer()/KillTimer() 的定时器会怎样?系统中可以同时存在多少个Window定时器对象?

问题是:使用一堆这样的计时器对象并依赖于良好的 Windows 计时器实现,或者创建一个每 30 毫秒计时一次的 Windows 计时器对象,并为它订阅所有自定义的 100-300 毫秒一次性计时器。

谢谢

最佳答案

当您尝试使用计时器消息时,问题在于它们是低优先级消息。实际上它们是假消息。计时器与底层内核计时器对象相关联 - 当消息循环检测到内核计时器发出信号时,它只是用一个标志标记当前线程消息队列,指示下一次调用 GetMessage - 当没有其他消息要处理时 - 应该综合及时返回一个 WM_TIMER 消息。

对于潜在的大量定时器对象,系统是否会公平地为所有定时器公平地发送定时器消息并不明显,并且任何系统负载都可以在很长一段时间内完全阻止 WM_TIMER 消息的生成。

如果您可以控制消息循环,则可以使用维护自己的计时器事件列表(以及应该发生的 GetTickCount 时间戳)和 MSGWaitForMultipleObject - 而不是 GetMessage 来等待消息。使用 dwTimeout 参数提供最小间隔 - 从现在开始 - 直到下一个计时器应该发出信号。因此,每当您有一个计时器要处理时,它就会从等待消息中返回。

和/或者你可以使用waitable timers - 在具有 MSGWaitForMultipleObjects 的 GUI 线程上,或仅在工作线程上,直接访问较低级别的计时功能。

关于c++ - SetTimer() 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893869/

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