当前位置: 首页 > news >正文

【qt创建线程两种方式】

QT使用线程的两种方式

1.案例进度条

案例解析:
如图由组件一个进度条和三个按钮组成,当点击开始的时候进度条由0%到100%,点击暂停,进度条保持之前进度,再次点击暂停变为继续,点击停止按钮进度条停止。
案例流程:
1.创建qwidget工程
2.添加四个控件,转到槽函数

在这里插入图片描述

2.使用线程方式一

2.1创建一个类继承QThread,重写run方法

2.2mythread.cpp

#include "mythread.h"
#include <QDebug>
MyThread::MyThread()
{}
void MyThread::stop()
{running=false;
}
//暂停继续
void MyThread::threadStop(bool flag)
{pause=flag;
}
//重写run方法
void MyThread::run()
{qDebug()<<"线程id:"<<currentThreadId();while (1) {//触发信号while(running){while (pause) {msleep(100);}if(value>100)value=0;emit valChage(value++);msleep(100);}exit(0);}
}

2.3mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QDebug>
//继承QThread重写run方法
class MyThread : public QThread
{Q_OBJECT
public slots:void stop();void threadStop(bool flag);
signals:void valChage(int);
public:MyThread();void run();
private:int value=0;bool running=true;bool pause=false;
};#endif // MYTHREAD_H

2.4widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QProgressBar>
#include<QThread>
#include "mythread.h"
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
signals:void stop();void threadStop(bool);
private slots:void on_pushButton_clicked();void on_pushButton_3_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;MyThread *mythread;
};
#endif // WIDGET_H

2.5widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked(){mythread= new MyThread();//绑定信号与槽函数connect(mythread,&MyThread::valChage,ui->progressBar,&QProgressBar::setValue);//延时connect(mythread,&MyThread::finished,mythread, &QObject::deleteLater);connect(this,&Widget::stop,mythread,&MyThread::stop);connect(this,&Widget::threadStop,mythread,&MyThread::threadStop);mythread->start();ui->pushButton->setEnabled(false);}void Widget::on_pushButton_3_clicked()
{emit stop();
}
void Widget::on_pushButton_2_clicked()
{static bool flag=true;if(flag){emit threadStop(true);ui->pushButton_2->setText("继续");flag=false;}else{emit threadStop(false);ui->pushButton_2->setText("暂停");flag=true;}
}

3.使用线程方式二

3.1创建类继承QObject

在这里插入图片描述

3.2qworker.h

这里的槽函数实现直接写在.h文件中,不够规范,只便与学习观看,切不要效仿。

#ifndef QWORKER_H
#define QWORKER_H
#include <QObject>
#include <QThread>
#include <QApplication>
class qworker : public QObject
{Q_OBJECT
public:explicit qworker(QObject *parent = nullptr);signals:void dataChanged(int);
public slots:void doWorking(){while (!sFlag) {if(current>=100)current=0;while (pFlag) {QThread::msleep(10);//接收来自外部进程的事件,否则收不到信号QApplication::processEvents();}emit dataChanged(current++);QThread::msleep(10);QApplication::processEvents();}sFlag=false;current=0;}void pause(bool flag){pFlag=flag;}void stop(){sFlag=true;}
private://进度条int current=0;//暂停bool pFlag=false;//停止bool sFlag=false;
};
#endif // QWORKER_H

3.3widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
//引入qworker.h
#include "qworker.h"namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
signals:void working();void pause(bool);void stop();
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();
c
private:Ui::Widget *ui;qworker *worker;QThread thread;
};
#endif // WIDGET_H

3.4widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);worker=new qworker();//移动到线程中worker->moveToThread(&thread);//开始connect(this,&Widget::working,worker,&qworker::doWorking);//暂停connect(this,&Widget::pause,worker,&qworker::pause);//停止connect(this,&Widget::stop,worker,&qworker::stop);connect(worker,&qworker::dataChanged,ui->progressBar,&QProgressBar::setValue);thread.start();
}
Widget::~Widget()
{delete ui;
}
void Widget::on_pushButton_clicked()
{emit working();
}void Widget::on_pushButton_2_clicked()
{static bool flag=true;if(flag){emit pause(true);flag=false;ui->pushButton_2->setText("继续");}else{emit pause(false);flag=true;ui->pushButton_2->setText("暂停");}
}
void Widget::on_pushButton_3_clicked()
{emit stop();
}

4.总结

两种方式都可以完成案例需求:

方式一:

1.通过继承QThread类重写run方法

2.重写类MyThread的虚函数void run();,即新建一个函数protected void run(),然后对其进行定义。

3.在需要用到多线程的地方,实例MyThread,然后调用函数MyThread::start()后,则开启一条线程,自动运行函数run()。

4.当停止线程时,调用MyThread::wait()函数,等待线程结束,并且回收线程资源。

方式二:

1.继承QObject类,创建对象。

2.通过moveToThread将派生类对象移动到一个线程中。

3.通过信号连接派生类的槽函数,将耗时的工作放到这个槽函数中运行。

4.用信号QThread::finished绑定槽函数QThread::deleteLatater(),在线程退出时,自动销毁该线程和相关资源。

5.通过QThread的start()函数开启多线程。

相关文章:

【qt创建线程两种方式】

QT使用线程的两种方式 1.案例进度条 案例解析&#xff1a; 如图由组件一个进度条和三个按钮组成&#xff0c;当点击开始的时候进度条由0%到100%&#xff0c;点击暂停&#xff0c;进度条保持之前进度&#xff0c;再次点击暂停变为继续&#xff0c;点击停止按钮进度条停止。 案…...

网络安全-一句话木马

声明 遵纪守法 请严格遵守网络安全法相关条例&#xff01; 此分享主要用于交流学习&#xff0c;请勿用于非法用途&#xff0c;一切后果自付。 一切未经授权的网络攻击均为违法行为&#xff0c;互联网非法外之地。 反制 大家在知道了常规一句话的木马之后&#xff0c;就可以通…...

在k8s中,使用DirectPV CSI作为分布式存储的优缺点

DirectPV 提供了一种直接将物理卷(Physical Volumes)与 Kubernetes 集群中的 Pod 绑定的机制。 利用 DirectPV,你可以将相应的 PV 直接与节点上的物理存储设备(如磁盘)进行绑定,而无需通过网络存储服务(如 NFS 或 Ceph)来提供存储。这种直接访问物理卷的方式,有助于提…...

自动化AD域枚举和漏洞检测脚本

linWinPwn 是一个 bash 脚本&#xff0c;可自动执行许多 Active Directory 枚举和漏洞检查。该脚本基于很多现有工具实现其功能&#xff0c;其中包括&#xff1a;impacket、bloodhound、netexec、enum4linux-ng、ldapdomaindump、lsassy、smbmap、kerbrute、adidnsdump、certip…...

数据库管理-第151期 Oracle Vector DB AI-03(20240218)

数据库管理151期 2024-02-18 数据库管理-第151期 Oracle Vector DB & AI-03&#xff08;20240218&#xff09;1 向量数据库应用场景2 Oracle Vector DB3 Vector数据类型4 Vector运算5 Vector DML插入向量获取向量 总结 数据库管理-第151期 Oracle Vector DB & AI-03&am…...

Vue3+vite搭建基础架构(6)--- 使用vue-router

Vue3vite搭建基础架构&#xff08;6&#xff09;--- 使用vue-router 说明官方文档安装vue-router使用vue-router测试vue-router 说明 这里记录下自己在Vue3vite的项目使用vue-router的过程&#xff0c;不使用ts语法&#xff0c;方便以后直接使用。这里承接自己的博客Vue3vite搭…...

深入解析Android AIDL:实现跨进程通信的利器

深入解析Android AIDL&#xff1a;实现跨进程通信的利器 1. 介绍Android AIDL Android Interface Definition Language (AIDL) 是一种Android系统中的跨进程通信机制。AIDL允许一个应用程序的组件与另一个应用程序的组件通信&#xff0c;并在两者之间传输数据。 AIDL的主要作…...

【笔记】Helm-5 Chart模板指南-14 下一步

下一步 本指南旨在为chart开发者提供对如何使用Helm模板语言的强大理解能力。该模板聚焦于模板开发的技术层面。 但涉及到chart的实际日常开发时&#xff0c;很多内容本指南并没有覆盖到。这里有一些有用的文档链接帮助您创建新的chart&#xff1a; CNCF的 Artifact Hub 是ch…...

axios 官网速通

前言&#xff1a;参考 AXIOS 中文文档 一 起步 1. 介绍 1.1 Axios 是什么&#xff1f; Axios 是一个基于 promise 网络请求库&#xff0c;作用于 node.js 和浏览器中。在服务端使用 node.js 的 http 模块, 在客户端 (浏览端) 使用 XMLHttpRequests。 1.2 安装 $ npm instal…...

luigi,一个好用的 Python 数据管道库!

🏷️个人主页:鼠鼠我捏,要死了捏的主页 🏷️付费专栏:Python专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前言 大家好,今天为大家分享一个超级厉害的 Python 库 - luigi。 Github地址:https://github.com/spotify/luigi 在大数据时代,处理海量数据已经成…...

用HTML5实现动画

用HTML5实现动画 要在HTML5中实现动画&#xff0c;可以使用以下几种方法&#xff1a;CSS动画、使用<canvas>元素和JavaScript来实现动画、使用JavaScript动画库。重点介绍前两种。 一、CSS动画 CSS3 动画&#xff1a;使用CSS3的动画属性和关键帧&#xff08;keyframes&…...

【Linux笔记】进程间通信之管道

一、匿名管道 我们在之前学习进程的时候就知道了一个概念&#xff0c;就是进程间是互相独立的&#xff0c;所以就算是两个进程是父子关系&#xff0c;其中一个进程退出了也不会影响另一个进程。 也因为进程间是互相独立的&#xff0c;所以两个进程间就不能直接的传递信息或者…...

【Node-RED】安全登陆时,账号密码设置

【Node-RED】安全登陆时&#xff0c;账号密码设置 前言实现步骤密码生成setting.js 文件修改 安全权限 前言 Node-RED 在初始下载完成时&#xff0c;登录是无账号密码的。基于安全性考虑&#xff0c;本期博文介绍在安全登陆时&#xff0c;如何进行账号密码设置。当然&#xff…...

Kubernetes基础(二十一)-k8s的服务发现机制

1 概述 Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#xff0c;提供了丰富的功能来简化容器化应用的管理。其中之一重要的特性就是服务发现机制&#xff0c;它使得应用程序能够在K8s集群中动态地发现和访问其他服务。本文将深入研究K8s中的服务发现机制&…...

华纳云:docker更新容器镜像的常用方法

更新 Docker 容器镜像可以通过以下几种方法实现&#xff1a; 1. 使用 docker pull 命令手动拉取更新的镜像&#xff1a; docker pull <镜像名>:<标签> 这会拉取指定镜像的最新版本或者指定标签的版本到本地。然后您可以停止并删除现有的容器&#xff0c;使用新的镜…...

什么时候会触发FullGC?描述一下JVM加载class文件的原理机制?

什么时候会触发 FullGC&#xff1f; 除直接调用 System.gc 外&#xff0c;触发 Full GC 执行的情况有如下四种。 1. 旧生代空间不足 旧生代空间只有 在新生代对象转入及创建为大对象、大数组时才会出现不足的现象&#xff0c;当执行 Full GC 后空间仍然不 足&#xff0c;则…...

HCIP-MGRE实验配置、PPP的PAP认证与CHAP认证、MGRE、GRE网络搭建、NAT

实验要求 R5为ISP,只能进行IP地址配素&#xff0c;其所有地址均为公有IP地址R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方 R2与R5之间使用PPP的chap认证&#xff0c;R5为主认证方 R3与R5之间使用HDLC封装。R1/R2/R3构建一个MGRE环境&#xff0c;R1为中心站点;R1、R4间为…...

react【四】css

文章目录 1、css1.1 react和vue css的对比1.2 内联样式1.3 普通的css1.4 css modules1.5 在react中使用less1.6 CSS in JS1.6.1 模板字符串的基本使用1.6.2 styled-components的基本使用1.6.3 接受传参1.6.4 使用变量1.6.5 继承样式 避免代码冗余1.6.6 设置主题色 1.7 React中添…...

SpringIOC之support模块SimpleThreadScope

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…...

气味是否能通过光缆、信号传播?

搜索资料&#xff0c;有一点点眉目&#xff0c; 参考&#xff1a;未来网络可以传送气味 如何产生并被感知--双鸭山新闻网...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...