PyQt中的多线程QThread示例

news2024/11/15 8:25:34

PyQt中的多线程

  • 一、PyQt中的多线程
  • 二、创建线程
    • 2.1 设计ui界面
    • 2.2 设计工作线程
    • 2.3 主程序设计
  • 三、运行结果示例

一、PyQt中的多线程

传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,那么当执行这个程序时,虽然实际上该操作正在进行,但用户界面通常会冻结而不再响应。

为了解决这个问题,通常会让用户的UI界面运行在它自己的线程中,而另外的事件处理过程则发生在一个或多个其他线程中。这样做之后,即使在处理那些数据密集的事件时,应用程序也能对GUI用户界面保持响应。当在一个单处理器上运行时,多线程应用程序可能会比实现同样功能的单线程应用程序运行得更慢一些,无法体现出其优势。但在目前多处理器系统越来越普及的情况下,多线程应用程序可以在不同的处理器中同时执行多个线程,从而获得更好的总体性能。

二、创建线程

2.1 设计ui界面

我们通过下面这个小例子来展示一下多线程的处理。用户界面如下。

使用Qt designer新建一个widget窗口,然后在其中添加2个button,分别是theradA和threadB,点击btn_theradA时,会不断地在控制台打印字母A,点击btn_theradB打印字母B。保存该ui文件为Form.ui

20221208001038

界面设计完毕后,使用以下命令,将Form.ui转换为form.py

pyuic5 -o form.py Form.ui

20221208001747

2.2 设计工作线程

添加一个工作线程类,用于完成按钮按下后需要执行的任务。
MyThread.py

from PyQt5.QtCore import QThread, qDebug
import time

class MyThread(QThread):
    def __init__(self, thread_name):
        super().__init__()
        self.__stop_running = False         # 此变量用于控制线程的运行
        self.__thread_name = thread_name    # 线程名,用于区分是哪个线程

    def run(self):
        while not self.__stop_running:
            qDebug(f'{self.__thread_name} is running')  # 不停地打印,模拟执行任务
            time.sleep(1)
            
    def stop(self):
        self.__stop_running = True

在QT应用程序中提供多线程是非常简单的,只需要子类化QThread并且重新实现它的run()函数即可。

如上所述,我们定义了一个自己的Thread类,名为MyThread,它派生自QThread类,并且重新实现了run()函数。

当调用线程的start()函数时,就会自动调用run()函数。只要stop_running标志为false,run()函数就会不断地进行打印,模拟任务的执行。当控制离开run()函数时,线程就会终止。

2.3 主程序设计

程序入口文件main.py

from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QCloseEvent
from PyQt5.QtCore import qDebug
import sys
from MyThread import MyThread
from form import Ui_Form

class MyWidget(QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.__init_ui()
        
        # 定义2个工作线程
        self.__threadA = MyThread('threadA')
        self.__threadB = MyThread('threadB')
        
        # 连接button的clicked信号到对应的槽函数
        self.__my_form.btn_threadA.clicked.connect(self.start_or_stop_threadA)
        self.__my_form.btn_threadB.clicked.connect(self.start_or_stop_threadB)
        
    def __init_ui(self):
        self.__my_form = Ui_Form()
        self.__my_form.setupUi(self)
        
    def start_or_stop_threadA(self):
        if self.__threadA.isRunning():
            self.__threadA.stop()
        else:
            self.__threadA.start()
        
    def start_or_stop_threadB(self):
        if self.__threadB.isRunning():
            self.__threadB.stop()
        else:
            self.__threadB.start()
            
    def closeEvent(self, e:QCloseEvent):
        qDebug('stop all threads...')
        self.__threadA.stop()
        self.__threadB.stop()
        self.__threadA.wait()
        self.__threadB.wait()
        e.accept()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    my_widget = MyWidget()
    my_widget.show()
    sys.exit(app.exec_())

主程序界面通过Ui_Form类的setupUi建立,随后我们将两个button的clicked信号绑定到我们定义的槽函数start_or_stop_threadA和start_or_stop_threadB上,这样,点击按钮之后,就可以执行我们自定义的线程动作。

在关闭窗口时,会产生QCloseEvent事件,我们重写了closeEvent方法来对线程执行了清理工作,确保应用程序是以一种原始清空的状态进行退出。当然了,在这个例子中,是否这样做其实并没有什么影响,这里只是举个例子示范一下。

三、运行结果示例

执行main.py, 单击按钮A时,控制台就会输出A,再次单击则会停止输出。按钮B同理。当按钮A和按钮B被按下同时工作时,A和B会交替输出。

运行效果如下:

20221208003621

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA SCRIPT设计模式--结构型--设计模式之Proxy代理模式(12)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

搭建LNMP平台实现负载均衡与高可用

目录 环境要求 安装服务 搭建服务 1. nfs主机操作 2. web1主机操作 3. web2主机操作 4. php主机操作 5. mysql主机操作 6. 验证1 7. lb1主机操作 8. lb2主机操作 9. 验证2 测试1 测试2 网站故障解决 验证 环境要求 实验目标:搭建LNMP平台实现负载均衡与高可用。 拓…

web课程设计——健身俱乐部健身器材网站模板(24页)HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

解析Vue项目每一个文件夹及文件的作用

使用vue-cli2.x脚手架为每个vue项目创建脚手架项目结构,项目结构目录中每个文件夹介绍如下: 1、build 文件夹 里面是对 webpack 开发和打包的相关设置,包括入口文件,输出文件,使用的模块等。 1.1 webpack.base.conf.j…

人大金仓 +用友:助力企业数智化转型,实现高质量发展

金兰组织联合解决方案集数字化浪潮下,联合解决方案已经成为这个时代的必然选择。如何依托各自产品的功能与特点,持续优化和完善解决方案能力,满足客户更多、更复杂的业务诉求,成为数字服务厂商的重要工作内容。为此,金…

我的电脑图标没了怎么办?3个方法找回消失的图标

最近,很多小伙伴都在私信小编,说他们的电脑桌面图标不见了。我的电脑图标没了怎么办?别担心。图标突然消失了,很可能是你不小心隐藏了桌面图标。这里有3个方法可以帮助你快速恢复并找到电脑图标,一起来看看吧&#xff…

现代基准测试程序种类以及使用方法

文章目录基准测试程序种类常见测试程序概述常见测试程序使用Dhrystone的使用UnixBench的使用CPU-Z的安装与使用参考文献现代计算机的性能测量极大地依赖于在其上运行的工作负载,为了测量和分析计算机系统的性能人们常常选择或构造一组能反映其工作负载特征的程序&am…

python文件转换成exe可执行的windows文件

一、介绍 python的程序需要运行环境有时候很不方便,因为要交给别人代码可能因为环境的原因运行各种问题,这里给出直接讲python程序转换成exe文件,很方便直接给执行程序就可以,也不用担心运行环境问题而运行不了 二、工具 1、安装…

[奶奶看了都会]ChatGPT保姆级注册教程

大家好,我是小卷 最近几天OpenAI发布的ChatGPT聊天机器人火出天际了,连着上了各个平台的热搜榜。这个聊天机器人最大的特点是模仿人类说话风格同时回答大量问题。 有人说ChatGPT是真正的人工智能,它不仅能和你聊天,还是写小作文…

[附源码]Python计算机毕业设计SSM基于微信平台的匿名电子投票系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

web课程设计网页规划与设计 HTML+CSS+JavaScript仿英雄联盟LOL首页(1个页面)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

第4季4:图像sensor的驱动源码解析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、sensor驱动源码的框架 mpp定义了一整套sensor驱动的实现和封装,这里以ar0130型号的sensor为例进行说明。 1、sensor层驱动 (1)sensor层驱动位于mpp/componen…

Java基础面试题

请介绍全局变量和局部变量的区别 Java中的变量分为成员变量和局部变量,它们的区别如下: 成员变量: 成员变量是在类的范围里定义的变量;成员变量有默认初始值;未被static修饰的成员变量也叫实例变量,它存储于…

知识图谱-KGE-语义匹配-双线性模型-2019:TuckER

【paper】 TuckER: Tensor Factorization for Knowledge Graph Completion【简介】 这篇文章是英国爱丁堡大学的研究者发表于 ICML 2019 上的文章,提出了 TuckER,是一个线性的张量分解模型,对表示三元组事实的二值张量做 Tucker 分解。 背景…

python中nmupy获取本地数据和索引

1. numpy读取数据 可以使用numpy中的loadtxt进行数据读取,所包含的参数如下 参数名解释frame文件,字符串等也可以是.gz或bz2压缩文件dtype数据类型,即CSV中字符串以什么数据类型读入数组中,默认是np.floatdelimiter分隔字符串&a…

CAS:2379387-10-5;TPE-丙烯酰胺;AIE聚集诱导发光

英文名称:2-Propenamide,N-[4-(1,2,2-triphenylethenyl)phenyl]- 英文同义词:2-Propenamide,N-[4-(1,2,2-triphenylethenyl)phenyl]- CAS号:2379387-10-5 分子式:C29H23NO 分子量:401.5 结构式: AIE聚集诱导发光材料的特点: 1.在固态下有强发光特性&…

Typecho-handsome主题如何统计全站字数

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

phpstudy2020安装及简单使用教程

phpstudyV8.0以上使用教程 简介安装步骤配置搭建网站自己的第一个PHP程序 最新版长这样 简介 按我的理解,phpstudy是一个集成式的PHP运行环境,虽然是个软件,但他实现的功能就是给PHP语言编写的脚本赋予一个可执行的环境,可以…

GPR(高斯过程回归)

写在前面:   本文为科研理论笔记的第三篇,其余笔记目录传送门: 理论笔记专栏目录 介绍结束下面开始进入正题: 1 高斯分布 ​   一元高斯分布的概率密度函数为: p(x)1σ2πexp⁡(−(x−μ)22σ2);简写为&#xff…

Lecture2:损失函数及优化

目录 1.损失函数 1.1 支持向量机SVM 1.1.1 SVM的代价函数及优化目标 1.1.2 如何理解将SVM成为大间距分类器 1.1.3 大间距分类器的数学原理 1.1.4 SVM核函数(构建非线性分类器) 及控制点的选择 1.1.5 构建自己的SVM 1.2 softmax分类器 1.3 soft…