问题描述:
写了一个小应用,有两个控件一个播放摄像头视频,一个固定时间间隔显示的算法检测过的图片(图片实时从摄像头读取)。
最开始做的方案是:一个线程负责采集摄像头的图像数据流,
一个线程负责把数据流的图片显示到控件上,
在主线程进行算法运算。
但是,每次主线程做算法运算的时候显示控件就会卡顿。
这里主线程做了两件事,一件是负责了主逻辑和算法模型的计算。
因此,博主做了另外一个方案:
单独做一个线程负责算法的计算,把显示的QT程序和主逻辑放到了主线程上,想通过把显示作为主线程来解决卡顿问题。
结果还是不行,运算的时候显示控件仍然会卡。
解决方式和原因:
最后博主对数据流进行追踪,去找显示控件是卡在哪一步了,追踪发现显示控件卡在update之前,这意味着图像数据一直在更新,
同时也生成了图片,就是没有显示,博主在查阅了多方资料后猜测可能是PyQt在使用多线程的时候资源分配不平衡,同时得知PyQt的GUI程序是不会在同一时间出现两个线程同时运行,而是不同的线程之间轮流交换python解释器的控制权,在同一个线程之中QT程序比python代码更具优先使用权,除非在不同线程中,那么问题就好解释了虽然显示程序和主逻辑在同一个线程中,但是主逻辑存在大量定时器和循环,在逻辑进入耗时代码的时候,解释器的控制权无法回到显示程序的手上。
解决方法是把所有耗时程序都放到多线程中运行,只留下显示控件的代码作为主线程。