PyQt5学习笔记-07

Qt中的线程

Posted by hmoytx on May 6, 2018

线程

线程是程序执行流的最小单元,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。 线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 由于Qt中所有界面都是在UI线程中(也被称为主线程,就是执行了QApplication::exec()的线程),在这个线程中执行耗时的操作都会导致主线程阻塞,只管来说就是ui失去响应,用户体验差。因此对于一些操作需要用QThread去开启线程,由其他线程在后台完成耗时的操作,以防止ui的阻塞。

具体代码

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

global sec
sec=0

class WorkThread(QThread):
    trigger = pyqtSignal()
    def __int__(self):
        super(WorkThread, self).__init__()

    def run(self):
        for i in range(203023030):
            pass
        self.trigger.emit()

class mainWindow(QWidget, Ui_Form):

    def __init__(self):
        super(mainWindow, self).__init__()
        self.setupUi(self)
        self.timer = QTimer()
        self.workthread = WorkThread()
        self.pushButton.clicked.connect(self.work)
        self.timer.timeout.connect(self.counttime)

    def counttime(self):
        global sec
        sec += 1
        self.lcdNumber.display(sec)

    def work(self):
        self.timer.start(1000)
        self.workthread.start()
        self.workthread.trigger.connect(self.timestop)

    def timestop(self):
        self.timer.stop()
        global sec
        sec = 0



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

运行测试

首先先简单设计一个UI,为了方便说明用了一个经典的例子时钟和耗时操作。 界面如下 demo1

运行时,LCD会按秒数增加 thread1

一旦for循环执行完毕,timer停止计时。 thread2

总结

对于任务较多且存在耗时操作(网络操作,复杂计算操作等)的Qt程序,一定要开启线程,放到后台去运行,防止ui阻塞。 QThread是一个抽象类,要继承以后重写run虚函数,执行的时候用start启用。