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

时间:2015-06-07 19:07:30

标签: c++ multithreading qt daq-mx

我目前正在处理我必须为测量设备设置的Qt GUI。该设备正在使用一个帧抓取卡,可以快速地从线阵相机中抓取图像。我的图像处理并不复杂,需要0.2ms才能完成,用QCustomPlot显示信号和处理结果大约需要40ms,这是完全可以的。 除了GUI输出外,经过处理的信号也将由NI DAQ设备作为模拟信号输出。

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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

答案 1 :(得分:0)

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

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

说,在t时刻,线程(2)完成处理frame[(t+0)%3],立即将输出目的地更改为frame[(t+1)%3],并通知线程(3),它循环遍历frame[(t+2)%3]中的数据{1}},在适当时切换为frame[(t+0)%3]

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