与Qt同时运行后台循环或回调C++应用程序?

run background loop or callbacks concurrently with qt C++ application?

本文关键字:回调 C++ 应用程序 循环 后台 Qt 运行      更新时间:2023-10-16

我正在用C++编写一个qt5应用程序来控制我的机器人装置。我正在使用运行 Ubuntu 18.04 的 Raspberry Pi 来实现这一点。该程序永远不会在Linux以外的任何东西上运行。我对qt不太熟悉,但似乎运行qt应用程序的常用方法是返回

int QApplication::exec()

在主函数中。但是,我需要同时运行与 GUI 无关的代码。例如,我需要在编码器每次更改状态时执行回调。此回调与用户输入或 GUI 无关。如何使主函数在同时运行 qt 应用程序窗口时接受回调?

文档说:

To make your application perform idle processing, i.e., executing a special function whenever
there are no pending events, use a QTimer with 0 timeout. More advanced idle processing schemes 
can be achieved using processEvents().

我真的不明白这两种方法如何适用于我的情况。应该使用这些方案中的任何一种,还是应该使用另一种技术?一个简单的例子会对我有很大帮助。

编辑:由于下面的评论,我正在添加这个:

我宁愿不间隔采样,因为它很可能会完全错过状态的一些变化。我正在通过Pi的gpio引脚上的输入从AM26C32芯片读取数据输出。本质上,状态的每个更改都需要执行回调。由于每次电机转有 40,000 个状态,因此我无法进行定期检查 - 回调需要立即执行。编码器(传感器(是增量的,而不是绝对的。另外,我正在使用 pigpio 库进行 gpio 处理。

编辑 2:经过更多的阅读,我想我需要将 QThread 与事件循环一起使用。树莓派 3B+ 有 4 个内核;如果我在一个线程上运行 GUI,并在另一个线程上运行每个(2 个(编码器,这可能会起作用。有人有这方面的经验吗?我在这里走在正确的轨道上吗?

在我看来,这更多的是关于处理程序的设计来处理事件,可能是实时的,就像你谈论机器人控制一样

作为 qt 应用程序线程中的回调 => 被 GUI 事件阻止执行

在后台线程中 => 基本上不受 GUI 事件的中断,因为您可以控制优先级。请参阅:http://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html

后台线程中的 IMO 处理是更好的选择。即使您使用的是Qt,您仍然可以使用其他线程/计时器实现。

pigpio 的频率计数器 1 示例仍然适用

如果需要回调和 GUI 之间的通信,可以使用免等待队列(例如 https://github.com/Taymindis/wfqueue (在它们之间传递消息,同时不会被 GUI 线程的进度阻塞

最后,您必须确保 GPIO 回调可以在每个间隔内完成。