首页 > 其他分享 >PySide6之子线程

PySide6之子线程

时间:2024-03-12 20:46:40浏览次数:13  
标签:__ self PySide6 之子 线程 信号 workThread QThread

QThread

方法1:子类化创建多线程

  1. 创建子线程,继承自QThread类
  2. 在子线程中自定义信号
  3. 在子线程中重写 run() 方法,进行信号的触发
  4. 在主线程中实例化子线程
  5. 在主线程中对子线程的信号进行绑定
  6. 在主线程中开启子线程
import time
from PySide6.QtCore import *
from PySide6.QtWidgets import *

# s1. 子线程类:继承自QThread
class WorkThread(QThread):
    # s2. 自定义信号
    signal = Signal(str)

    def __init__(self):
        super().__init__()

    # 重写 run() 方法
    def run(self):
        for i in range(10):
            time.sleep(1)
            # s3. 信号触发
            self.signal.emit(str(i))    # 发送信号

# 主线程
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 创建一个标签,用于显示子线程的信号
        self.label = QLabel()

        # s4. 实例化子线程
        self.workThread = WorkThread()  # 用self实例化,防止子线程被回收
        # s5. 对子线程的信号进行绑定
        self.workThread.signal.connect(lambda x: self.label.setText(f"当前的值为:{x}"))  # 将信号连接到标签
        self.workThread.started.connect(lambda: self.label.setText("子线程开启"))         # 子线程开启时激活
        self.workThread.finished.connect(lambda: self.label.setText("子线程关闭"))        # 子线程结束时激活
        self.workThread.finished.connect(lambda: self.workThread.deleteLater())         # 释放子线程
        # s6. 开启子线程
        self.workThread.start()

        # 布局
        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.label)
        self.setLayout(self.mainLayout)


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

方法2:实例化创建多线程

  1. 在子线程中自定义信号
  2. 在子线程中进行信号的触发
  3. 在主线程中实例化子线程
  4. 在主线程中实例化QThread类
  5. 在主线程中将子线程用 moveToThread() 方法绑定到QThread
  6. 在主线程中对子线程的信号进行绑定
  7. 在主线程中,QThread开始时调用子线程类中的方法
  8. 在主线程中开启子线程
import time
from PySide6.QtCore import *
from PySide6.QtWidgets import *

# 子线程类
class WorkThread(QObject):
    # s1. 自定义信号
    signal = Signal(str)

    def __init__(self):
        super().__init__()

    def runFunction(self):
        for i in range(10):
            # s2. 信号触发
            self.signal.emit(str(i))    # 发送信号
            time.sleep(1)

# 主线程
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 创建一个标签,用于显示子线程的信号
        self.label = QLabel()

        # s3. 实例化子线程
        self.workThread = WorkThread()  # 用self实例化,防止子线程被回收
        # s4. 实例化QThread类
        self.thread = QThread()
        # s5. 将子线程绑定到QThread
        self.workThread.moveToThread(self.thread)
        # s6. 对子线程的信号进行绑定
        self.workThread.signal.connect(lambda x: self.label.setText(f"当前的值为:{x}"))  # 将信号连接到标签

        # s7. QThread开始时,调用子线程类中的方法
        self.thread.started.connect(self.workThread.runFunction)
        # QThread结束时激活
        self.thread.finished.connect(lambda: print("Finished"))
        # s8. 开启子线程
        self.thread.start()


        # 布局
        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.label)
        self.setLayout(self.mainLayout)


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

主线程向子线程传递信号

标签:__,self,PySide6,之子,线程,信号,workThread,QThread
From: https://www.cnblogs.com/crossovers/p/18069120

相关文章

  • JUC源码讲解:线程状态转换
    JUC源码讲解:线程状态转换抛出问题一个线程,有七种(也可以说是六种)状态,究竟是哪七种呢?在什么条件下,线程会进入一个状态,又在什么条件下,线程转而进入另一种状态呢?下面我们从源码角度看一下线程的状态转换观察源码我们进去Thread.State.class中,可以看到,线程状态由一个enum定义......
  • 多线程系列(十七) -线程组介绍
    一、简介在之前的多线程系列文章中,我们陆陆续续的介绍了Thread线程类相关的知识和用法,其实在Thread类上还有一层ThreadGroup类,也就是线程组。今天我们就一起来简单的聊聊线程组相关的知识和用法。二、什么是线程组线程组,简单来说就是多个线程的集合,它的出现主要是为了更方便的......
  • 深入浅出Java多线程(十一):AQS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer)。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代多核CPU环境中,多线程编程已成为提升系统性能和并发处理能力的关键手段。然而,当多个线程共享同一资源......
  • 自己简单实现一个线程池
    线程池Java中的线程池是运用最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。线程池的好处/作用:1.不需要频繁的创建和销毁线程,提高相应速度2.管理线程,避免无休止的创建线程导致资源枯竭。(不会每来一个任务就创建一个线程,线程不断的取任务执行)线程池......
  • C#3种常见的定时器(多线程)
    总结以下三种方法,实现c#每隔一段时间执行代码:方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间;调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间Threadthread=newThread(newThreadStart(obj.Method1));thread.Start();方法二:使用System.Timers......
  • 多线程
    多线程的实现java.lang.Thread类代表多线程注意事项启动线程必须是start方法,不是调用run方法不要把主线任务放在启动子线程之前继承Thread/***@authorPickle*@versionV1.0*@date2024/3/1116:43*/publicclassMyThreadextendsThread{@Override......
  • HashMap线程不安全实例(jdk8)
    一、前言本文紧接:HashMap线程不安全实例(jdk1.7)-seeAll-博客园(cnblogs.com),介绍jdk8中线程不安全的一些情况,且主要是在上篇文章的基础上和jdk1.7做一个对比。 二、初始化桶数组的例子1,测试代码和上篇文章一样。2,断点设置同样设置在初始化桶数组的地方,且断点的详细配......
  • t01_多线程
    进程与线程进程:进程是程序的基本执行实体线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位在Java中,进程(Process)和线程(Thread)是两个并发执行的概念,用于实现多任务处理和并发执行。它们都是操作系统和编程语言级别的概念,用于管理和执......
  • Java高并发讲解:守护线程——在源代码中分析setDaemon()
    Java高并发讲解:守护线程——在源代码中分析setDaemon()提出问题我们都知道Java线程分为主线程和守护线程,守护线程是需要手动指定的(setDaemon(true)......
  • Spring多线程事务处理
    一、背景本文主要介绍了spring多线程事务的解决方案,心急的小伙伴可以跳过上面的理论介绍分析部分直接看最终解决方案。在我们日常的业务活动中,经常会出现大规模的修改插入操作,比如在3.0的活动赛事创建,涉及到十几张表的插入(一张表可能插入一行或者多行数据),由于单线程模型的关系,......