c++ Qt异步进程的快速定时建议
C++ Qt fast timing of asynchronous processes advice
我目前正在处理一个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
,一个有三个缓冲区的圆形缓冲区是最小的。
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Ardunio UNO解决了多个重叠的定时器循环
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- 如何在Qt中修改QWebsocket定时器
- 使用 qt 和 opengl、定时精度和垂直同步问题、c++ 显示图像
- Udp 在 QT 定时器信号中写入数据报
- 在Qt中实现精确定时器
- Qt如何杀死一个定时器开始使用startTimer() API
- Qt应用程序中的Boost定时器
- c++ Qt异步进程的快速定时建议
- Qt定时器只能用于QThread启动的线程