与Qt同时运行后台循环或回调C++应用程序?
run background loop or callbacks concurrently with qt C++ application?
我正在用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 回调可以在每个间隔内完成。
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数