PyQt5之QThread多线程

PyQt5之QThread多线程

要使用QThread开始一个线程,可以创建它的一个子类,然后覆盖其QThread.run()函数。

一、QThread类中的常用方法

方法 描述
start() 启动线程
wait() 阻止线程,直到满足如下条件之一:1、与此QThread对象关联的线程已完成执行(即从run()返回时)。如果线程完成执行,此函数将返回True;如果线程尚未启动,此函数也返回True。2、等待时间的单位是毫秒。如果时间是ULONG_MAX(默认值),则等待,永远不会超时(线程必须从run()返回);如果等待超时,此函数将返回False。
sleep(s) 强制当前线程睡眠s秒

二、QThread类中的常用信号

信号 描述
started 在开始执行run()函数之前,从相关线程发射此信号
finished 当程序完成业务逻辑时,从相关线程发射此信号

三、QThread实例

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Demo(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 50, 500, 400)
        self.setWindowTitle('QThread')

        self.thread = Worker()
        self.list = QListWidget()
        self.btn = QPushButton('开始')
        layout = QGridLayout(self)
        layout.addWidget(self.list,0,0,1,2)
        layout.addWidget(self.btn,1,1)
        self.btn.clicked.connect(self.slotStart)
        self.thread.sinOut.connect(self.slotAdd)

    def slotAdd(self,inf):
        self.list.addItem(inf)
        #实时刷新页面
        QApplication.processEvents()

    def slotStart(self):
        self.btn.setEnabled(False)
        self.thread.start()

class Worker(QThread):
    #自定义信号
    sinOut = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.working = True
        self.num = 0

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        while self.working == True:
            file_str = 'File index{0}'.format(self.num)
            self.num += 1
            #发射信号
            self.sinOut.emit(file_str)
            #休眠2秒
            self.sleep(2)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Demo()
    form.show()
    sys.exit(app.exec_())

注:由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿;而如果在执行这个耗时程序时不断地运行QApplication.processEvents(),那么就可以实现一边执行耗时程序,一边刷新页面的功能,给人的感觉就是程序运行很流畅。

运行效果如下:

PyQt5之QThread多线程_第1张图片

你可能感兴趣的:(Python,多线程,thread,pyqt,python)