首页 > 编程 > Python > 正文

PyQt5中多线程模块QThread使用方法的实现

2020-02-15 21:28:51
字体:
来源:转载
供稿:网友

本文主要讲解使用多线程模块QThread解决PyQt界面程序唉执行耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题。用户使用工具过程中出现这些问题时会误以为程序出错,从而把程序关闭。这样,导致工具的用户使用体验不好。下面我们通过模拟上述出现的问题并讲述使用多线程QThread模块解决此类问题的方法。

PyQt程序卡顿和无法实时显示问题现象

使用PyQt界面程序,点击运行按钮后,程序在显示框中每秒打印1个数字。程序代码如下:

# -*- coding: utf-8 -*-import sysimport timefrom PyQt5.QtCore import QThread, pyqtSignalfrom PyQt5.QtWidgets import QApplication, QMainWindowfrom QThread_Example_UI import Ui_Formclass MyMainForm(QMainWindow, Ui_Form):  def __init__(self, parent=None):    super(MyMainForm, self).__init__(parent)    self.setupUi(self)    self.runButton.clicked.connect(self.display)  def display(self):    for i in range(20):      time.sleep(1)      self.listWidget.addItem(str(i))if __name__ == "__main__":  app = QApplication(sys.argv)  myWin = MyMainForm()  myWin.show()  sys.exit(app.exec_())

程序运行过程结果如下(点击Run按钮后界面出现 未响应 字样 , 同时程序也没有出现每隔1秒打印1个数字,实际结果是循环结束后20个数字一同展示):

 

问题分析

上述实现的GUI程序都是单线程运行,对于需要执行一个特别耗时的操作时就会出现该问题现象。要解决这种问题可以考虑使用多线程模块QThread。

多线程模块QThread基本原理

QThread是Qt的线程类中最核心的底层类。由于PyQt的的跨平台特性,QThread要隐藏所有与平台相关的代码 要使用的QThread开始一个线程,可以创建它的一个子类,然后覆盖其它QThread.run()函数。

class Thread(QThread):  def __init__(self):    super(Thread,self).__init__()  def run(self):    #

接下来创建一个新的线程

thread = Thread()thread.start()

可以看出,PyQt的线程使用非常简单,建立一个自定义的类(如Thread),自我继承自QThread ,并实现其run()方法即可。在使用线程时可以直接得到Thread实例,调用其start()函数即可启动线程,线程启动之后,会自动调用其实现的run()的函数,该方法就是线程的执行函数 。

业务的线程任务就写在run()函数中,当run()退出之后线程就基本结束了,QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束之时执行一段代码进行资源的初始化和释放操作,更灵活的使用方法是,在自定义的QThread实例中自定义信号,并将信号连接到指定的槽函数,当满足一定的业务条件时发射此信号。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表