当前位置:   article > 正文

pyqt5 多进程_PyQt5 的一个线程占用 CPU 为何会导致另一个线程及UI线程响应变慢?...

多个线程同时执行,其中一个线程占100%的cpu,会导致其他线程变慢吗

我之前是搞嵌入式的,现在要写一个上位机,选择使用 Python+PyQt5 来完成。我的程序有两个执行线程以及一个主线程,主线程初始化完两个执行线程之后,一个执行线程进行串口的数据交互,另一个线程执行一个比较耗时的操作( OpenCV 图像处理),完全占满 CPU 。 这两个线程都是使用 QThread 来完成的,现在遇到了一个问题:图像处理线程长时间的计算,会导致串口线程出现响应变慢的现象(串口丢包导致通信失败),与此同时主线程的 UI 操作也会卡顿。 下面是部分代码(版面原因,部分无用代码已删除)。

这个程序里只有一个已知的耗费时间的代码(在下面程序中用image_proc表示),删掉这个函数程序便会变回正常速度。

class MainWindowClass(QMainWindow, Ui_MainWindow):

def __init__(self):

super(MainWindowClass, self).__init__() # 初始化父类

self.setupUi(self) # 初始化窗口

self.imgProcTrd = ThreadImageProc(op_param, op_cam_idx) # 创建图像处理线程

self.imgProcTrd.signalImageSend.connect(self.callback_image_display) # 连接回传到 GUI 的事件

self.serialCommTrd = ThreadSerialComm() # 创建串口通信线程

self.serialCommTrd.signalSerialStatus.connect(self.callback_serial_event)

class ThreadImageProc(QThread):

# 通过类成员对象定义信号对象

signalImageSend = pyqtSignal(numpy.ndarray)

def __init__(self, op_param, cam_idx):

super(ThreadImageProc, self).__init__()

def run(self):

while True:

ret, cap_img = cap.read()

img = self.image_proc(cap_img)

self.signalImageSend.emit(img)

class ThreadSerialComm(QThread):

signalSerialStatus = pyqtSignal(list) # 串口上报

def __init__(self):

super(ThreadSerialComm, self).__init__()

def run(self):

while True:

# 省略串口通信函数

想请问一下各位大佬这是什么情况?有没有解决方案? RTOS 是抢占式系统,即使是单核心的嵌入式处理器也会保证每过一个 Tick 执行一次任务调度来确保高优先级的任务得以抢占 CPU 。按照我的理解,电脑这种多核心处理器应该是把多个线程分配给多个核心执行的(仅仅是我很初级的理解,望赐教),为什么会出现这种子线程卡死其他线程甚至 UI 线程的呢?有没有什么解决方法?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/150932
推荐阅读
相关标签
  

闽ICP备14008679号