PySide6之多线程
一、QThread
方法1:子类化创建多线程
- 创建子线程,继承自QThread类
- 在子线程中自定义信号
- 在子线程中重写 run() 方法,进行信号的触发
- 在主线程中实例化子线程
- 在主线程中对子线程的信号进行绑定
- 在主线程中开启子线程
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:实例化创建多线程
- 在子线程中自定义信号
- 在子线程中进行信号的触发
- 在主线程中实例化子线程
- 在主线程中实例化QThread类
- 在主线程中将子线程用
moveToThread()方法绑定到QThread - 在主线程中对子线程的信号进行绑定
- 在主线程中,QThread开始时调用子线程类中的方法
- 在主线程中开启子线程
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()
二、主线程向子线程传递信号
在子线程的 __init__() 方法中设置形参,在主线程实例化子线程时传入消息。
import time
from PySide6.QtCore import *
from PySide6.QtWidgets import *
# 子线程类:继承自QThread类
class WorkThread(QThread):
# 自定义信号
signal = Signal(str)
# 在 __init__() 方法中接收主线程的信号
def __init__(self, message):
super().__init__()
self.message = message
# 重写 run() 方法
def run(self):
# 子线程向主线程发送信号
self.signal.emit(f"子线程接收到信息:{self.message}")
# 主线程
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# 创建一个标签,用于显示子线程的信号
self.label = QLabel()
# 实例化子线程,并传入发送给子线程的消息
self.workThread = WorkThread("这是主线程发给子线程的信息!")
# 对子线程的信号进行绑定
self.workThread.signal.connect(lambda message: self.label.setText(message))
# 开启子线程
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()
三、多线程的阻塞和删除(释放)
多线程的阻塞:
在主线程中,调用子线程实例化对象的 wait() 方法,可以对子线程进行阻塞,直到子线程方法运行结束或返回值,才继续运行。如:
self.workThread.wait()
多线程的删除(释放):
在主线程中,调用子线程实例化对象的 deleteLater() 方法,可以对子线程进行删除,该方法通常和子线程对象的 finished() 配合使用,用于在子线程执行完成后释放内存。如:
self.workThread.finished.connect(lambda: self.workThread.deleteLater())
PySide6之多线程的更多相关文章
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java多线程
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
随机推荐
- 大模型_2:Prompt Engineering
目录: 1.提示工程简介 2.如何写好提示词 2.1 描述清晰 2.2 角色扮演 2.3 提供示例 2.4 复杂任务分解 2.5 使用格式符区分语义 2.6 情感和物质激励 2.7 使用英语 2.8 ...
- R_回归模型实例一
工作和生活中存在大量的具有相关性的事件,当找到不同变量之间的关系,我们就会用到回归分析.回归分析(Regression Analysis):是用来确定2个或2个以上变量间关系的一种统计分析方法. 在回 ...
- DNS(3) -- dns常用命令-rndc-dig-host-nslookup
目录 1 bind自带客户端命令 1.1 rndc命令 1.2 检查配置文件语法 2 客户端测试命令 2.1 dig命令 2.2 host命令 2.3 nslookup命令 1 bind自带客户端命令 ...
- GESP 202312 游记
day 0 把一本通上的指针扫了一遍,睡觉! day 1 9:00入场,在第二个考场. 冲进昌平二中,码了Hello,World!. 9:30发网址,开题 监考老师居然说阅读程序题可以打代码!···· ...
- C语言:算法题判断是否有效字符({[]})---括号
给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. ...
- MindSponge分子动力学模拟——自定义控制器(2024.05)
技术背景 分子动力学模拟中的控制器(Controller)可以被用于修改模拟过程中的原子坐标和原子速度等参量,从而达到控制系统特定参量的目的.例如控温器可以用于实现NVT系综,控压器可用于实现NPT系 ...
- 初识上位机(上):搭建PLC模拟仿真环境
大家好,我是Edison. 作为一个工业自动化领域的程序员,不懂点PLC和上位机,貌似有点说不过去.这里我用两篇小文带你快速进入上位机开发领域.后续,我会考虑再出一个系列文章一起玩工控上位机. 什么是 ...
- 工作面试老大难-MySQL中的锁类型
MySQL 是支持ACID特性的数据库.我们都知道"C"代表Consistent,当不同事务操作同一行记录时,为了保证一致性,需要对记录加锁.在MySQL 中,不同的引擎下的锁行为 ...
- Android 13 - Media框架(25)- OMXNodeInstance(二)
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们了解了 OMXNodeInstance 的创建过程,以及 IOmx 服务和 OMXNodeInstance.OMX组件之间的联系.接下来我 ...
- SpringBoot使用@Value获取不到值的问题
背景 在一次SpringBoot项目改造为Cloud的过程中,使用Nacos作为配置中心获取属性,改造后程序启动报错,查看日志,定位到代码: 解决方案 如果了解Bean的生命周期的同学应该知道,Spr ...