10

我需要每 1 毫秒触发一次计时器。文档报告说,插槽调用可能比虚拟函数调用慢得多。

但是,如果我们将信号/插槽与事件发生进行比较,哪种机制会更快、更高效并且产生更少QTimer的开销:将timeout()信号连接到插槽或裸QObject::startTimer()\ QObject::killTimer()with QObject::timerEvent()

对于 Windows 和 Linux,上述问题的答案是否相同?

4

2 回答 2

11

QTimer实际上只是功能的一个信号槽包装器QObject::startTimer(),因此毫无疑问,它在所有平台上都会产生更多的开销(它在内部实现QObject::timerEvent()——它的这个函数的实现只是为了发出timeout()信号)。

值得注意的QBasicTimer是,它是围绕功能的更轻量级的包装器QObject::startTimer()。如果您使用QBasicTimer,您仍然需要实现QObject::timerEvent(),但它会为您管理计时器 ID。因此,aQBasicTimer结合了 a 的一些易用性和QTimer使用该QObject::startTimer()机制的效率。

于 2012-09-27T19:33:01.677 回答
7

事实上,如果您需要精度,QT 并不能保证您的计时器在 1 毫秒后准确执行。

至少在 QT 4.7.X 之前,如果 QT 有一个事件(在事件循环内处理),所有计时器都会在“事件循环”中在内部检查到期(然后引发它们的信号)。我的意思是,它们不会作为中断其他任务等的操作系统事件执行。

如果您的循环中的任何其他 3 个事件例如每个事件需要 0.5 秒,您可以获得的是 1.5 秒后执行的计时器。

我希望我的记忆没有失败,几个月前我看了一下 QT 计时器代码,现在我不记得计时器事件是在其他事件之后还是之前处理的。

希望这对您有所帮助。

于 2012-09-28T08:40:49.730 回答