c++ Qt异步进程的快速定时建议

C++ Qt fast timing of asynchronous processes advice

本文关键字:定时 Qt 异步 进程 c++      更新时间:2023-10-16

我目前正在处理一个Qt GUI,我必须设置一个测量设备。该设备与一个帧采集卡一起工作,它可以非常快速地从线相机中捕获图像。我的图像处理并不复杂,只需要0.2ms就可以完成,用QCustomPlot显示信号和处理结果大约需要40ms,完全可以。除GUI输出外,处理后的信号还将作为模拟信号由NI DAQ设备输出。

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

我当前的方法或想法是创建一个数据池线程和两个工作线程。一个工作线程从帧捕获器接收数据,对其进行处理并更新数据池。第二个工作线程以NI DAQ设备中的时钟给出的约2-5kHz的特定频率更新NI DAQ的模拟通道。GUI线程会不时地读取数据池,以大约20-30Hz的速率更新信号显示。

我想使用Qt线程管理和信号槽机制,因为它的"简单",因为我已经与线程结合使用Qt和它的线程类。

有没有更好的方法,有人有什么想法或建议吗?是否有可能,我得到线程的时间问题?

此外,是否有可能将一个线程分配给多核CPU上的单个CPU核心,以便该核心仅处理该单个线程?

有没有更好的方法,有人有什么想法或建议吗?是否有可能,我得到线程的时间问题?

信号/插槽机制是好的,尝试它,如果你遇到性能问题,你仍然可以尝试找到另一种方法。采用信号/插槽机制,使用QAbstractVideoSurface和Mediaplayer进行实时视频处理。

此外,是否有可能将一个线程分配给多核CPU上的单个CPU核心,以便该核心仅处理该单个线程?

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

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

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

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

当我在一个具有10fps处理帧率和60fps NTSC输出帧率的图像处理项目上工作时,我使用了这种技术。为了消除tearing effect,一个有三个缓冲区的圆形缓冲区是最小的。