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

问题描述 投票:0回答:1

我正在用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与事件循环一起使用。 Raspberry Pi 3B +具有4个内核。如果我在一个线程上运行GUI,而每个线程(共2个)编码器在另一个线程上运行,则可能会起作用。有任何人对此有经验吗?我在这里吗?

c++ qt callback robotics
1个回答
0
投票

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

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

在后台线程中=>由于可以控制优先级,因此几乎不受GUI事件的干扰。请参阅:http://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.