0

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

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

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

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

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

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

4

2 回答 2

0

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

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

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

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

于 2015-06-07T19:38:40.120 回答
0

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

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

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

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

于 2015-06-07T23:46:03.140 回答