我需要每 1 毫秒触发一次计时器。该文档报告说,插槽调用可能比虚拟函数调用慢得多。
但是,如果我们将信号/插槽与事件发生进行比较,哪种机制会更快、更高效并且产生更少QTimer
的开销:将timeout()
信号连接到插槽或裸QObject::startTimer()
\ QObject::killTimer()
with QObject::timerEvent()
?
对于 Windows 和 Linux,上述问题的答案是否相同?
QTimer
实际上只是功能的一个信号槽包装器QObject::startTimer()
,因此毫无疑问,它在所有平台上都会产生更多的开销(它在内部实现QObject::timerEvent()
——它的这个函数的实现只是为了发出timeout()
信号)。
值得注意的QBasicTimer
是,它是围绕功能的更轻量级的包装器QObject::startTimer()
。如果您使用QBasicTimer
,您仍然需要实现QObject::timerEvent()
,但它会为您管理计时器 ID。因此,aQBasicTimer
结合了 a 的一些易用性和QTimer
使用该QObject::startTimer()
机制的效率。
事实上,如果您需要精度,QT 并不能保证您的计时器在 1 毫秒后准确执行。
至少在 QT 4.7.X 之前,如果 QT 有一个事件(在事件循环内处理),所有计时器都会在“事件循环”中在内部检查到期(然后引发它们的信号)。我的意思是,它们不会作为中断其他任务等的操作系统事件执行。
如果您的循环中的任何其他 3 个事件例如每个事件需要 0.5 秒,您可以获得的是 1.5 秒后执行的计时器。
我希望我的记忆没有失败,几个月前我看了一下 QT 计时器代码,现在我不记得计时器事件是在其他事件之后还是之前处理的。
希望这对您有所帮助。