PySide6/PyQT多线程的使用

news/2024/4/27 4:14:49/文章来源:https://blog.csdn.net/weixin_45081575/article/details/130278453

前言

上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题,这次来具体介绍下多线程在使用上的一些细节。

本文尝试对以下两个问题进行解决:

  • PySide6/PyQT 多线程的使用不熟悉;
  • PySide6/PyQT 的应用程序里有耗时任务,导致应用程序卡死;

值得注意的是在 PySide6/PyQT 中实现多线程,可以选择的有很多,
QObject、QThread、QRunnable、QtConcurrent 等;
但是它们在使用上都大差不差,所以在本篇文章中,挑选了 QThread 来讲解。


知识点📖📖

本文用到的几个PySide6的知识点及链接。

作用链接
创建新线程QThread
对象间通信的机制,允许对象发送和接收信号Signal
用于响应Signal信号的方法Slot

实现

QThread 多线程

使用注意事项

在使用 PySide6QThread 时,注意事项有以下几点:

  • 不要使用Python原生的线程库来实现;
  • 消息或任务结果 通过Signal信号来传递;
  • 不要在QThread调用主线程的GUI控件应用程序会进入卡死状态;
  • QThread对象必须在主线程中创建,否则程序可能会奔溃;
    • 因为PySide6是基于事件循环的框架,GUI线程子线程都运行在同一个事件循环中。如果在子线程中创建和启动QThread对象,它会尝试创建一个新的事件循环,这会导致两个事件循环并行运行,产生无法预估的结果。

代码

代码用上一篇文章中的,看这里 —《解决PySide6/PyQT的界面卡死问题(PySide6/PyQT多线程》

# -*- coding: utf-8 -*-import timeimport requestsfrom PySide6.QtCore import (QThread, Signal, Slot, QSize)
from PySide6.QtWidgets import (QApplication, QPushButton, QLabel, QVBoxLayout, QWidget)class MyThread(QThread):signal_tuple = Signal(tuple)def __init__(self, func, *args, **kwargs):super().__init__()self.func = funcself.args = argsself.count: int = kwargs.get('count')def run(self):for idx in range(1, self.count + 1):result = self.func(*self.args)time.sleep(1)# 任务完成后发出信号self.signal_tuple.emit((idx, result))class MainWindow(QWidget):def __init__(self, parent=None):super().__init__(parent=parent)self.setup_ui()#self.button.clicked.connect(self.setup_thread)def setup_ui(self):self.setWindowTitle('demo')self.resize(QSize(250, 180))# 创建一个垂直布局layout = QVBoxLayout()# 创建一个标签self.label = QLabel('This is a label => ')layout.addWidget(self.label)# 创建一个按钮self.button = QPushButton('Send Request')layout.addWidget(self.button)# 将布局设置为主窗口的布局self.setLayout(layout)# 显示窗口self.show()def setup_thread(self):self.thread_ = MyThread(self.send_request,count=10)self.thread_.signal_tuple.connect(self.thread_finished)self.thread_.start()def send_request(self):return requests.get('https://www.csdn.net/').text[:15]@Slot(tuple)def thread_finished(self, item):self.label.setText('This is a label => ' + str(item))if __name__ == '__main__':app = QApplication([])window = MainWindow()window.show()app.exec()

代码释义





MyTherad类

  • 继承了QThread
  • 创建了一个 signal_tuple信号;
  • 类接收一个func函数以及不定长的传参(这里主要传funccount
  • 重写 run方法,线程的 start() 方法被调用时,就会自动执行run方法;
  • 执行 count 次数的func,每次睡眠1秒,使用signal_tuple 将执行结果和执行次数发送出去。


MainWindow类

  • 继承了 QWidget,实现了包含一个按钮和一个标签的简单窗口;
  • setup_thread 函数中,实例化了MyThread,并将实例化后的signal_tuple信号连接到 thread_finished函数;
  • thread_finished为槽函数,当signal_tuple发出信号时,这Slot(槽函数)将被调用,并修改label 的显示。

在实例代码 以及 代码释义中可以清晰的看到,示例代码完美符合了本文中我指出来的 QThread 多线程的几个注意事项:

  • 使用Signal信号传递运行结果;
  • 在主线程中创新子线程;
  • 不在子线程中修改主线程的控件。

以上便是 QThread 多线程PySide6/PyQT 中的使用。


后话

本次分享到此结束,
see you~~🐱‍🏍🐱‍🏍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103283.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux基础IO之 内存文件操作】

目录: 前言一、引入C语言中的文件操作系统文件操作open 位图权限close、write、readlseek C语言中的文件操作函数与系统文件操作函数的联系 三、文件描述符1.文件描述符是什么2.文件缓冲区再谈重定向 四、文件缓冲区分类语言级缓冲区为什么要有两个缓冲区 五、仿写c…

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻,因为我们即将能生产出令人惊叹的3D效果! 变换 向量和矩阵变换包括太多内容,但由于学过线性代数和GAMES101,因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 (1)GLM…

8、接口的高级用法

1、索引类型 我们可以使用接口描述索引的类型和通过索引得到的值的类型,比如一个数组[‘a’, ‘b’],数字索引0对应的通过索引得到的值为’a’。我们可以同时给索引和值都设置类型,看下面的示例: interface RoleDic {[id: number…

Pinia与Vuex区别、Pinia安装与使用

目录 一、Pinia和Vuex区别 二、Pinia使用state、getters、actions 1、安装使用Pinia 2、State 3、actions 4、getters 三、Pinia划分模块 1、目录结构 2、store/user.js 3、某组件使用 四、Pinia持久化存储 1、安装插件 2、store/index.js 3、store/user.js 4、…

收废品小程序开发中的常见问题及解决方法

常见问题 1. 用户界面设计 小程序的用户界面设计至关重要。设计师需要在用户界面中提供清晰的指示,以便用户可以轻松地找到他们需要的功能。同时,设计师还需要确保用户界面的整体风格与公司的品牌形象相符。 2. 功能开发 开发小程序的功能需要考虑到…

5G网络切片路由选择策略介绍

终端保存的NSSP(Network Slice Selection Policy)策略来源于网络侧。 NSSP规则是将应用程序匹配到S-NSSAI(Single network slice selection assistance information),并将应用程序绑定到现有PDU会话或发起新的PDU会话。 NSSP功能 NSSP的作用就是为应用程序选择S-NSSAI和…

堆的原理解析

看这篇文章需要对比较器有一定的了解,可以看我的这篇文章: 认识比较器_鱼跃鹰飞的博客-CSDN博客 堆的实际存储方式是数组,但是脑海中应该把他想象成一种树的结构 依次加入下标0-8的9个数(添加过程中会不断的和父节点大小进行比…

QT Graphics View 绘图架构之场景、视图与图形项简介

1、场景、视图与图形项 采用QPainter 绘图时需要在绘图设备的 paintEvent()事件里编写绘图的程序,实现整个绘图过程。这种方法如同使用 Windows 的画图软件在绘图,绘制的图形是位图,这种方法适合于绘制复杂性不高的固定图形,不能…

基于ResNet-attention的负荷预测

一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制。我们来看…

机器人教学中游戏化课程案例尝试

本文内容严格按创作模板发布: 2023年LPL春季赛季后赛正在火热进行中,你们心中的总冠军是哪支队伍呢?作为热爱游戏的程序猿,一起来聊聊你那些有意义的游戏开发经历吧! 游戏化ROS机器人课程的优势有以下七点&#xff1a…

android studio RadioButton单选按钮

1.定义 <!--单选按钮--> <TextViewandroid:layout_marginTop"10dp"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"请选择你的性别&#xff1a;"> </TextView> <RadioGrou…

首发支持NOA的单征程3行泊一体域控,这家Tier1开“卷”

NOA正成为智能驾驶下半场的竞争焦点之一。 显然&#xff0c;NOA所处的L2/L2区间&#xff0c;在技术上仍然属于驾驶辅助领域&#xff0c;但在传统L2级ADAS功能的基础上增强了部分场景的功能ODD。在部分政策允许的国家和地区&#xff0c;可以实现有条件的「解放双手」。 高工智…

最佳实践|如何写出简单高效的 Flink SQL?

摘要&#xff1a;本文整理自阿里巴巴高级技术专家、Apache Flink PMC 贺小令&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为三个部分&#xff1a; 1. Flink SQL Insight 2. Best Practices 3. Future Works Tips&#xff1a;点击「阅读原文」查…

【Linux】一文读懂HTTP协议:从原理到应用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;HTTP协议…

机器人工程师与孔乙己文学

本文内容严格按创作模板发布&#xff1a; 孔乙已是鲁迅笔下人物&#xff0c;穷困流倒还穿着象征读书人的长衫&#xff0c;迁腐、麻木。最近&#xff0c;大家自我调佩是“当代孔乙己”&#xff0c;学历成为思想负担&#xff0c;找工作时高不成低不就。你可以从以下几个角度说说…

Android---启动页+闪屏页

目录 启动页 闪屏页 启动页 app 在进入首页面的过程中&#xff0c;都会线加载一张图片然后再进入闪屏页。这样&#xff0c;可以给用户很好的体验。 作用&#xff1a;避免加载白屏页面&#xff0c;进行业务的预处理&#xff08;网络检测、数据预加载...&#xff09; 界面组成…

一款纯Web化免费SQL工具,重新定义数据库管理

SQL Studio是一款由麦聪软件研发的多数据库管理工具&#xff0c;提供Windows、Linux 和 MacOS三种版本的软件包&#xff0c;支持中英文两种语言。SQL Studio是用Java编写的&#xff0c;默认使用 JDK 8进行编译。 下载看这里: [SQLStudio] (http://www.maicongs.com/#/home/web)…

.Net Framework 4.6.1+版本的Winform程序开启Web服务,支持Http webapi

Winform程序开启Web服务 背景思路方法1方法2方法3&#xff08;本文使用的方法&#xff09; 实现在winform程序中引入几个nuget包新建一个Startup类&#xff08;叫什么名字都行&#xff09;修改Program文件创建controller 运行效果(打开浏览器&#xff0c;输入如下地址&#xff…

ThinkPHP模型操作上

ThinkPHP模型操作上 前言模型一、创建模型二、模型操作 总结 前言 在mvc架构中&#xff0c;模型的解释是写逻辑代码的地方&#xff0c;其实还可以这样理解&#xff0c;就是一串操作写在一个模型类中&#xff0c;就是你要完成某一项功能&#xff0c;将这个功能的代码写在一个mod…

记录-使用双token实现无感刷新,前后端详细代码

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新。最后做了一些总结&#xff0c;本文详细介绍了实现流程&#xff0c;前后端详细代码。前端使用了Vue3Vite&#xff0c;主要是axios封装&#xff0c;服务…