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 异步进程快速计时建议的主要内容,如果未能解决你的问题,请参考以下文章