在性能关键型软件 (Qt) 中使用定时器

Using timers with performance-critical software (Qt)

我正在开发一个应用程序,负责通过 UDP 连接移动和管理机器人。

申请需要:

目前,我已经实现了以上所有内容。但是,当激活看门狗或使用两个或多个 QTimer 对象时,应用程序无法定期发送数据包。该应用程序通常可以运行,但我不会考虑它 "production ready"。我已经尝试使用计时器的精度标志(Qt::PreciseQt::CoarseQt::VeryCoarse),但我仍然遇到问题。

备注:

我们使用定时器的地方:

对于将 QTimer 对象与性能关键代码一起使用,您有什么建议吗(欢迎提出任何想法)。请注意,我也尝试过使用不同的线程,但这给我带来了更多问题,因为应用程序不会在 "sync" 中,因此无法有效控制我们测试的机器人。

其实我好像低估了Qt的定时器和事件循环的性能。在我的系统上,事件循环周期平均大约 20k 纳秒加上调度排队函数调用的开销,间隔为 1 毫秒的计时器很少延迟,大多数超时是几千纳秒不到一毫秒。但它是一个高端系统,在嵌入式硬件上可能会差很多。

您应该花时间分析您的目标系统和 Qt 构建以确定它是否确实 运行 足够快,并根据这些测量调整您的时间以补偿系统延迟以获得您的活动安排得更准时。

你绝对应该让计时器线程尽可能空闲,因为如果你通过 IO 或大量计算阻塞它,你的计时器将不准确。使用专用线程来安排工作,使用额外的工作线程来完成实际工作。您也可以尝试稍微调整一下线程优先级。

最坏的情况,寻找第 3 方高性能事件循环实现或创建你自己的,也可能是更快的信号机制。正如我在评论中已经提到的,Qt 的线程间排队信号非常慢,至少与间接函数调用之类的东西相比是这样。

最后但同样重要的是,如果您想每 N 个单位时间执行一次任务 X,则只有当任务 X 在您的系统上花费 N 个单位时间或更少时才有可能。您需要对每个任务以及同时 运行ning 的所有任务进行此考虑。并且为了得到准确的调度,你应该测量任务X花了多长时间,如果小于它的频率,则在剩余时间内安排下一次执行,否则立即执行。