C++ Qt 异步进程快速计时建议

Posted

技术标签:

【中文标题】C++ Qt 异步进程快速计时建议【英文标题】:C++ Qt fast timing of asynchronous processes advice 【发布时间】:2015-06-07 19:07:30 【问题描述】:

我目前正在处理一个必须为测量设备设置的 Qt GUI。该设备正在使用图像采集卡,它可以非常快速地从线阵相机中抓取图像。我的不是那么复杂的图像处理需要 0.2 毫秒才能完成,而使用 QCustomPlot 显示信号和处理结果大约需要 40 毫秒,完全可以。 除了 GUI 输出之外,处理后的信号也会被 NI DAQ 设备作为模拟信号输出。

我的问题是我必须以恒定频率更新模拟信号,并且仍然不时更新 GUI。

我目前的方法或想法是创建一个数据池线程和两个工作线程。一个工作线程从图像采集卡接收数据,对其进行处理并更新数据池。第二个工作线程使用 NI DAQ 设备中的时钟给定的大约 2-5kHz 的特定频率更新 NI DAQ 的模拟通道。 并且GUI线程会不定时的读取数据池,以20-30Hz左右的频率更新信号显示。

我想使用 Qt 线程管理和他的信号和槽机制,因为它“简单”并且因为我已经结合 Qt 及其线程类使用线程。

是否有更好的方法,有人有想法或任何建议吗?有没有可能我在线程时间上遇到问题?

此外,是否可以在多核 CPU 上将一个线程分配给一个 CPU 内核,以便该内核只处理该单个线程?

【问题讨论】:

【参考方案1】:

是否有更好的方法,有人有想法或任何建议吗?有没有可能我在线程时间上遇到问题?

信号/插槽机制很好,尝试一下,如果遇到性能问题,您仍然可以尝试寻找另一种方法。我使用 Signal/Slot Mechanism 通过 QAbstractVideoSurface 和 Mediaplayer 进行实时视频处理。它对我有用。

此外,是否可以在多核 CPU 上将一个线程分配给一个 CPU 内核,以便该内核只处理该单个线程?

你为什么要这样做?操作系统或线程库有一个调度程序,负责处理这些事情。只要你自己没有充分的理由这样做,你就应该使用现有的方式。

【讨论】:

【参考方案2】:

我会尝试使用三个线程:1)UI 线程,2)抓取和处理线程,3)模拟输出线程。

诀窍是使用三重缓冲区将抓取和处理的输出连接到模拟输出的输入。

假设此时t,thread(2) 处理完frame[(t+0)%3],立即将输出目标更改为frame[(t+1)%3],并通知正在循环frame[(t+2)%3] 中的数据的thread(3) 切换到frame[(t+0)%3] 适当时。

我在处理具有 10fps 处理帧速率和 60fps NTSC 输出帧速率的图像处理项目时使用了这种技术。要消除tearing effect,最少三个缓冲区的循环缓冲区。

【讨论】:

以上是关于C++ Qt 异步进程快速计时建议的主要内容,如果未能解决你的问题,请参考以下文章

c++异步回调函数引用传递空指针异常

如何从 QT(C++)中的子进程联系父进程以执行类中的方法?

如何在 C++ 或 Qt 中创建进程?

Qt C++ - 如何成功地将数据传递给子进程?

线程池和进程池

Qt中的linux系统守护进程