在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。
在 qt 中使用了多线程,有些事项是需要额外注意的:
默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新
子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理
主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制
start:
启动线程
wait():
阻止线程,直到满足如下条件之一:
。与此QThread 对象关联的线程已完成执行(即从run()返回时)。如果线程完成执行,此函数将返回 True;如果线程尚未启动,此函数也返回 True等待时间的单位是毫秒。如果时间是ULONG MAX(默认值),则等待永远不会超时(线程必须从 run()返回):如果等待超时,此函数将返回 Falsc
slecp()
强制当前线程睡眠秒秒。
信号:
started:
在开始执行 run0函数之前,从相关线程发射此信号
finished:
当程序完成业务逻辑时,从相关线程发射此信号
code :
start two thread;
import datetime
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from PyQt5 import QtWidgets
timer = QTimer()
class DPThread(QThread):
# 定义一个新的线程类用于数据处理
def __int__(self):
super(DPThread, self).__init__()
def run(self):
# 重写run函数,进程start()时调用run()函数
print("run DPThread...")
class PDThread(QThread):
# 定义一个新的线程类用于3D预览
def __int__(self):
global stl_finished
stl_finished = False
super(PDThread, self).__init__()
def run(self):
print("-----...")
# 重写run函数,进程start()时调用run()函数
print("run PDThread...")
class mywindows(QtWidgets.QMainWindow):
dp_work = DPThread()
pd_work = PDThread()
def __init__(self, parent=None):
super(mywindows, self).__init__(parent)
self.setWindowTitle("QThread 例子")
self.dp_work.finished.connect(self.dp_end)
self.pd_work.finished.connect(self.pd_end)
self.preview_3D()
def dp_end(self):
# 线程完成后的工作
print("run DPThread end")
QMessageBox.information(self, "数据处理", "dp_end 数据处理完成", QMessageBox.Ok)
self.dp_work.quit()
self.dp_work.wait()
def pd_end(self):
print("run PDThread end")
#QMessageBox.information(self, "数据处理", " PDThread 数据处理完成", QMessageBox.Ok)
self.pd_work.quit()
self.pd_work.wait()
self.dp_work.start()
def preview_3D(self):
print("run PDThread start...")
# 启动线程
self.pd_work.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
demo = mywindows()
demo.show()
sys.exit(app.exec_())