如何正确实现自定义定时器事件?

问题描述 投票:0回答:1

我用 wxWidgets 做了一些实验,并尝试每 20 毫秒触发一个事件。我的第一个方法是使用 wxTimer,乍一看它似乎工作正常,但测量时间表明,虽然计时器设置为 20ms,但它仅在周期 > 30ms 时触发。我发现这是一个常见问题。 为了更精确,我创建了一个创建线程的类,并在线程函数中使用 std::this_thread::sleep_for (20) 并随后发布 wxCommandEvent。这对于 20ms 的时间来说效果很好。但它还有 wxTimer 解决方案所不存在的其他缺点:

  • 调整窗口大小时,计时器会触发,但发布的事件不会被处理
  • 打开“文件”或“关于”菜单等菜单时也是如此

哪种方法是正确的?我可以给某个事件更高的优先级吗?我可以从我自己的代码中发布一个wxTimerEvent,而不是使用wxTimer吗?

events wxwidgets
1个回答
0
投票
如果您需要精确的计时,

wxTimer
确实不适合,它在“尽力而为”的基础上工作,如果您需要更精确的东西,使用工作线程是一个好主意。您没有说明如何从中发布事件,但如果您使用
wxQueueEvent()
CallAfter()
(也使用引擎盖下的事件),它应该已经可以工作了。

历史上存在一些错误,导致在本地系统模态事件循环运行时未处理已发布的事件(在调整大小或打开菜单时就是这种情况),但它应该可以工作,所以如果它不起作用,请将其报告为错误

© www.soinside.com 2019 - 2024. All rights reserved.