PyQt5之 Thread 多线程

QThread

Qt 线程中QThread的使用

在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。

在 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_())
相关推荐
如若12335 分钟前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
砚底藏山河2 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
视觉小萌新2 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
薛定谔的猫-菜鸟程序员3 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
Ramble_Naylor5 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
Allen_LVyingbo5 小时前
NVIDIA CUDA Tile 在医疗计算中的算子形式化、算法重构与内核实现
大数据·python·算法·重构·知识图谱·健康医疗·数据库架构
云和数据.ChenGuang5 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
我命由我123457 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
青少儿编程课堂7 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
atwednesday7 小时前
一文理解python中的task,协程,woker
python