运行 后台循环或回调与 qt C++ 应用程序并发?

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

我正在用 C++ 编写一个 qt5 应用程序来控制我的机器人装置。我正在使用 Raspberry Pi 运行ning Ubuntu 18.04 来完成此操作。除了 Linux,程序永远不会 运行。我不太熟悉 qt,但似乎 运行 qt 应用程序的常用方法是返回

int QApplication::exec()

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

文档说:

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 与事件循环结合使用。 Raspberry Pi 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回调在每个区间都能完成。