我目前正在处理一个Qt GUI,我必须为一个测量设备进行设置。该设备与帧采集卡一起工作,可以非常快速地从线阵相机中捕获图像。我的图像处理并不复杂,需要0.2ms才能完成,用QCustomPlot显示信号和处理结果需要大约40ms,这是完全可以的。除了图形用户界面输出外,处理后的信号还将由NI DAQ设备以模拟信号的形式输出。
我的问题是,我必须以恒定的频率更新模拟信号,同时仍然不时地更新GUI。
我目前的方法或想法是创建一个数据池线程和两个工作线程。一个工作线程从帧抓取器接收数据,处理它并更新数据池。第二个工作线程以NI DAQ设备中的时钟给出的大约2-5 5kHz的特定频率更新NI DAQ的模拟通道。并且GUI线程将不时地读取数据池以以大约20-30 of的速率更新信号显示。
我想使用Qt线程管理和他的signal- and -slot机制,因为它的“简单性”,而且因为我已经将线程与Qt及其线程类结合使用了。
有没有更好的方法,有人有主意或建议吗?有没有可能我在线程的计时上遇到了问题?
此外,在多核CPU上,是否可以将一个线程分配给一个单CPU核,以便该核只处理这个单线程?
发布于 2015-06-08 03:38:40
有没有更好的方法,有人有什么想法或建议吗?有没有可能我在线程的计时上遇到了问题?
信号/槽机制很好,试一试,如果你遇到性能问题,你仍然可以尝试寻找另一种方法。我使用信号/槽机制在QAbstractVideoSurface和Mediaplayer上进行实时视频处理。这对我很管用。
此外,在多核
上,是否可以将一个线程分配给一个单一的CPU核心,以便这个核心只处理这个单一的线程?
你为什么要这么做?操作系统或线程库有一个调度器,它负责处理这些事情。只要你没有充分的理由自己这么做,你就应该使用现有的方法。
发布于 2015-06-08 07:46:03
我会尝试三个线程: 1)UI线程,2)抓取-处理线程,3)模拟输出线程。
技巧是使用三重缓冲器将抓取和处理的输出连接到模拟输出的输入。
比方说,在t时刻,线程(2)完成对frame[(t+0)%3]的处理,立即将输出目的地更改为frame[(t+1)%3],并通知正在循环frame[(t+2)%3]中的数据的线程(3)在适当的时候切换到frame[(t+0)%3]。
我在一个图像处理项目中使用了这种技术,该项目的处理帧率为10fps,NTSC输出帧率为60fps。为了消除tearing effect,具有三个缓冲区的循环缓冲区是最小的。
https://stackoverflow.com/questions/30697404
复制相似问题