线程
线程是程序执行流的最小单元,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。 线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派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,为了方便说明用了一个经典的例子时钟和耗时操作。
界面如下
运行时,LCD会按秒数增加
一旦for循环执行完毕,timer停止计时。
总结
对于任务较多且存在耗时操作(网络操作,复杂计算操作等)的Qt程序,一定要开启线程,放到后台去运行,防止ui阻塞。 QThread是一个抽象类,要继承以后重写run虚函数,执行的时候用start启用。