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

Qt中线程的使用

Qt中线程的使用

在qt中线程的使用有两种方式,第一种就是创建一个类继承QObject类,之后使用moveToThread函数将线程添加到类中。另一种就是创建一个类继承QThread类,在类中实现run函数。

第一种方式:

1、首先创建一个自定义的类,继承QObject。

#ifndef THREAD001_H
#define THREAD001_H#include <QObject>class MyThread : public QObject
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);void stop();private:bool state = false;signals:public slots:void slotsFun(QString number);
};#endif // THREAD001_H
#include "mythread.h"
#include <QDebug>
#include <QThread>
MyThread::MyThread(QObject *parent) : QObject(parent)
{}void MyThread::stop()
{state = false;qDebug()<<"Thread001::stop() 当前线程号:"<< QThread::currentThreadId();
}void MyThread::slotsFun(QString number)
{qDebug()<<"父线程号:"<<number;qDebug()<<"当前线程号:"<< QThread::currentThreadId();state = true;static int i = 0;while(state){qDebug()<<"i的数值:"<<i <<"   state = "<<state;i++;QThread::sleep(1);}
}

以上代码就是创建的类,在上述的代码中,能看到在头文件中定义了一个slotsFun()槽函数、一个stop()公共函数和一个state私有的成员变量。

slotsFun()槽函数就是我们最终要执行的线程函数。

state私有的成员变量是为了设置线程函数的循环限制,当我们要停止线程退出的时候可以使用公共函数stop设置state为false,这样就退出了线程函数。

这里的stop函数不属于线程,而是属于主线程。

2、启动线程

当我们定义好了线程类之后,就可以在需要启动线程的地方启动线程了。

    QThread* m_thread = nullptr;//这个是qt的线程类MyThread* m_mythread = nullptr;//这个是我们自定义的线程类
void MainWindow::on_btn_create_clicked()
{if(m_thread == nullptr){m_thread = new QThread();//实例化线程对象m_mythread = new MyThread();//实例化自定义的线程对象m_mythread->moveToThread(m_thread);//线程绑定//线程结束函数信号槽,用于当线程结束之后释放资源。connect(m_thread,&QThread::finished,this,[=](){qDebug()<<"m_thread001 线程执行结束";m_thread->deleteLater(); //释放线程资源m_thread = nullptr;m_mythread->deleteLater();//释放自定定义的线程类资源m_mythread = nullptr;});//启动线程之后,线程发出的信号connect(m_thread,&QThread::started,this,[=](){qDebug()<<"m_thread001 线程执行启动";});//调用线程函数,线程启动之后,还需要调用一下自定义线程类中槽函数connect(this,&MainWindow::startThreadFun,m_mythread,&MyThread::slotsFun);}}
void MainWindow::on_btn_start_clicked()
{//启动线程m_thread->start();qDebug()<<"主线程id:"<<QThread::currentThreadId();//发送信号调用槽函数emit startThreadFun("看上面的主线程id");
}

3、关闭线程

关闭线程小编使用了很多方式,都没有达到理想的状态,首先是使用QThread中的**terminate**()函数,此函数关闭之后线程中的资源很难释放。因为他是强制的,线程函数无论执行到哪里了都会强制退出线程。

后面就换了中方式,先使用自定义线程类函数退出线程函数,之后再关闭线程类,这样就能很好的释放线程资源了。

void MainWindow::on_btn_stop_clicked()
{m_mythread->stop();m_thread->quit();m_thread->wait();
}

这里有个小知识点,就是假如我们在自定义的类中定义了俩个槽函数,并且都是在线程启动之后发出信号,那么这两槽函数都是此线程的线程函数,只不过是按发送信号的顺序执行的。

第二种方式

1、创建线程类继承QThread类

#ifndef MYTHREAD2_H
#define MYTHREAD2_H#include <QThread>
#include <QDebug>
class MyThread2 : public QThread
{
public:MyThread2();void stop();void run() override;
private:bool state = false;
};#endif // MYTHREAD2_H
#include "mythread2.h"MyThread2::MyThread2()
{}void MyThread2::stop()
{state = false;qDebug()<<"Thread001::stop() 当前线程号:"<< QThread::currentThreadId();
}void MyThread2::run()
{qDebug()<<"当前线程号:"<< QThread::currentThreadId();state = true;static int i = 0;while(state){qDebug()<<"slotsFuni的数值:"<<i <<"   state = "<<state;i++;QThread::sleep(1);}}

以上代码中run就是继承QThread中的虚函数run。使用这中方式启动线程直接调用start函数即可。

2、启动

void MainWindow::on_btn_start_clicked()
{if(m_mythread2 == nullptr){m_mythread2 = new MyThread2();connect(m_mythread2,&QThread::finished,this,[=](){qDebug()<<"m_mythread2 线程执行结束";m_mythread2->deleteLater();m_mythread2 = nullptr;});}m_mythread2->start();//启动线程
}

3、当run函数退出的是后线程就自动结束了。这里和第一种方式不太一样,第一种方式需要使用Qthread中的quit和wait函数。

相关文章:

Qt中线程的使用

Qt中线程的使用 在qt中线程的使用有两种方式&#xff0c;第一种就是创建一个类继承QObject类&#xff0c;之后使用moveToThread函数将线程添加到类中。另一种就是创建一个类继承QThread类&#xff0c;在类中实现run函数。 第一种方式&#xff1a; 1、首先创建一个自定义的类…...

基于YOLOv8开发构建蝴蝶目标检测识别系统

在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…...

【已解决】电脑连上网线但无法上网

文章目录 案例情况解决方案必要的解决方法简要概括详细步骤1、打开控制面板2、打开更改适配器设置3、 找Internet协议版本44、修改配置 可能有用的解决方法 问题解决原理Internet 协议版本 4&#xff08;TCP/IPv4&#xff09;确保IP地址和DNS服务器设置为自动获取 案例情况 网…...

Linux 学习记录57(ARM篇)

Linux 学习记录57(ARM篇) 本文目录 Linux 学习记录57(ARM篇)一、外部中断1. 概念2. 流程图框 二、相关寄存器1. GIC CPU Interface (GICC)2. GIC distributor (GICD)3. EXTI registers 三、EXTI 寄存器1. 概述2. 内部框图3. 寄存器功能描述4. EXTI选择框图5. EXTI_EXTICR1 &…...

Doris注意事项,Doris部署在阿里云,写不进去数据

1.Doris官网 Doris官网https://doris.apache.org/ 2.根本原因 本地idea访问FE&#xff0c;FE会返回BE的地址&#xff0c;但是在服务器上通过ip addr查看&#xff0c;发现只有局域网IP&#xff0c;所以FE返回了局域网的IP&#xff0c;导致idea连接不上BE 3.解决办法 重写Ba…...

502 Bad GateWay报错的解决方法

什么是502 bad gateway 报错 简单来说 502 是报错类型代码 bad gateway 错误的网关。是Web服务器作为网关或代理服务器时收到无效的响应。 用我们的口语说就是运行网站的服务器暂时挂了(不响应)。 产生错误的原因 1.连接超时 我们向服务器发送请求 由于服务器当前链接太多&am…...

openpnp - ReferenceStripFeeder 改版零件

文章目录 openpnp - ReferenceStripFeeder 改版零件概述笔记整体效果散料飞达主体磁铁仓盖板飞达编带中间压条飞达编带两边压条装配体用的8mm编带模型END openpnp - ReferenceStripFeeder 改版零件 概述 官方推荐了ReferenceStripFeeder的模型smd_strip_feeders_mod_tray.zip…...

VoxPoser:使用大语言模型(GPT-4)来对机器人操作的可组合三维值图【论文解读】

这是最近斯坦福的李飞飞团队的一篇论文:VoxPoser: Composable 3D Value Maps for Robotic Manipulation with Language Models 主要是通过大语言模型LLM和视觉语言模型VLM结合&#xff0c;来对机器人做各种日常操作&#xff0c;我们可以先来看下实际效果&#xff1a;大语言模型…...

RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”

RISC-V公测平台Web Server地址&#xff1a;http://175.8.161.253:8081 一、前言 Web Server是互联网应用的基础设施&#xff0c;无论是用户访问网站&#xff0c;还是后端服务提供商和开发者构建各种应用程序&#xff0c;Web Server都在其中扮演着至关重要的角色。 显而易见…...

Linux 发行版 CentOS 于 Ubuntu 软件的安装、卸载、查找

CentOS于Ubuntu 内核都是Linux&#xff0c;是一样的。 CentOS 软件格式 .rpm sudo yum [-y] [ install | remove | search ] 软件名称 install 安装 remove 移除 search 搜索 Ubuntu 软件格式 .deb sudo apt [-y] [ install | remove | search ] 软件名称 install 安装 remove…...

cmd相关操作命令

1.根据端口号查询对应进程的PID netstat -ano | findstr 端口号 例如&#xff1a;netstat -ano | findstr 9080&#xff1b;该端口所属进程的PID为6684 2.根据PID查询对应进程 tasklist | findstr PID 例如&#xff1a;tasklist | findstr 6684&#xff1b;该PID所属进程名为…...

使用EM算法完成聚类任务

EM算法&#xff08;Expectation-Maximization Algorithm&#xff09;是一种基于迭代优化的聚类算法&#xff0c;用于在无监督的情况下将数据集分成几个不同的组或簇。EM算法是一种迭代算法&#xff0c;包含两个主要步骤&#xff1a;期望步骤&#xff08;E-step&#xff09;和最…...

❤️创意网页:创意视觉效果粒子循环的网页动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…...

【MTI 6.S081 Lab】thread

【MTI 6.S081 Lab】thread 前言调度Uthread: switching between threads (moderate)实验任务Hints解决方案thread_switchthread_create()thread_schedule() Using threads (moderate)实验任务解决方案 Barrier (moderate)实验任务解决方案 本实验前去看《操作系统导论》第29章基…...

AWS / VPC 云流量监控

由于安全性、数据现代化、增长、灵活性和成本等原因促使更多企业迁移到云&#xff0c;将数据存储在本地的组织正在使用云来存储其重要数据。亚马逊网络服务&#xff08;AWS&#xff09;仍然是最受追捧和需求的服务之一&#xff0c;而亚马逊虚拟私有云&#xff08;VPC&#xff0…...

【C++学习笔记】extern “c“以及如何查看符号表

如何查看符号表 要查看.a文件的内容&#xff0c;可以使用ar命令。下面是一些常见的用法&#xff1a; 列出.a文件中包含的所有文件&#xff1a; ar t <filename.a>提取.a文件中的单个文件&#xff1a; ar x <filename.a> <filename.o>将.a文件中的所有文件提…...

24考研数据结构-数组和特殊矩阵

目录 数据结构&#xff1a;数组与特殊矩阵数组数组的特点数组的用途 特殊矩阵对角矩阵上三角矩阵和下三角矩阵稀疏矩阵特殊矩阵的用途 结论 3.4 数组和特殊矩阵3.4.1数组的存储结构3.4.2普通矩阵的存储3.4.3特殊矩阵的存储1. 对称矩阵(方阵)2. 三角矩阵(方阵)3. 三对角矩阵(方阵…...

服务器后台运行程序

代码运行 要让代码在服务器后台运行&#xff0c;有多种方法。在 Linux 系统中&#xff0c;最常见的有以下几种方式&#xff1a; **1. 使用 & 符号&#xff1a;** 在命令后面添加 & 符号可以让程序在后台运行。例如&#xff1a; bash python myscript.py &但是…...

大数据课程D7——hadoop的YARN

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解YARN的概念和结构&#xff1b; ⚪ 掌握YARN的资源调度流程&#xff1b; ⚪ 了解Hadoop支持的资源调度器&#xff1a;FIFO、Capacity、Fair&#xff1b; ⚪ 掌握YA…...

Rust vs Go:常用语法对比(十三)

题图来自 Go vs. Rust: The Ultimate Performance Battle 241. Yield priority to other threads Explicitly decrease the priority of the current process, so that other execution threads have a better chance to execute now. Then resume normal execution and call f…...

【AIGC内容竞争力突围关键】:为什么92%的ChatGPT使用者不会“讲故事”?资深NLP架构师首曝4层认知断层

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AIGC内容竞争力突围的关键认知跃迁 当生成式AI从“能写”迈入“懂场景、知约束、可迭代”的新阶段&#xff0c;内容竞争力的本质已悄然迁移——它不再取决于单次输出的流畅度&#xff0c;而系于人机协同的认知…...

零起点Python机器学习快速入门【1.0】

第 1 章 从阿尔法狗开始说起1.1 阿尔法狗的前世今生百度百科的“阿尔法狗”词条是&#xff1a;阿尔法狗&#xff08; AlphaGo&#xff09;是一款围棋人工智能程序&#xff0c;由谷歌&#xff08; Google&#xff09;旗下 DeepMind 公司的戴密斯哈萨比斯、大卫席尔瓦、黄士杰与他…...

使用 Node.js 和 Taotoken 为博客网站快速搭建一个智能内容摘要生成接口

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Node.js 和 Taotoken 为博客网站快速搭建一个智能内容摘要生成接口 对于个人博客站长而言&#xff0c;为篇幅较长的文章提供一…...

ChatGPT翻译质量真相:20年本地化专家实测12类文本(技术文档/法律合同/文学隐喻),准确率暴跌的3个致命盲区!

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ChatGPT翻译质量怎么样 ChatGPT 在多语种翻译任务中展现出较强的上下文理解与语义连贯能力&#xff0c;尤其在非技术类通用文本&#xff08;如日常对话、新闻摘要、文学性段落&#xff09;上&#xff0…...

DeepSeek模型权重完整性校验失效?揭秘SHA-3+SGX远程证明双因子加固新范式

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek模型安全加固 DeepSeek系列大语言模型在开源与商用场景中广泛应用&#xff0c;但其默认部署配置可能存在提示注入、越权推理、训练数据泄露及后门触发等安全风险。安全加固需从模型服务层、推理运行时…...

中小团队如何利用taotoken统一管理多个ai项目api成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 中小团队如何利用 Taotoken 统一管理多个 AI 项目 API 成本 当团队同时推进多个 AI 应用原型或项目时&#xff0c;一个常见的挑战随…...

机器学习原子间势能模型的不确定性量化:POPS框架解决模型误设挑战

1. 项目概述与核心挑战在材料科学和计算物理领域&#xff0c;机器学习原子间势能模型&#xff08;MLIAP&#xff09;的崛起&#xff0c;让我们第一次有机会以接近第一性原理&#xff08;如密度泛函理论&#xff0c;DFT&#xff09;的精度&#xff0c;去模拟包含成千上万个原子的…...

Monitorian多显示器亮度管理终极指南:条件命令、定时任务与快捷键实战技巧

Monitorian多显示器亮度管理终极指南&#xff1a;条件命令、定时任务与快捷键实战技巧 【免费下载链接】Monitorian A Windows desktop tool to adjust the brightness of multiple monitors with ease 项目地址: https://gitcode.com/gh_mirrors/mo/Monitorian 还在为多…...

专业指南:yuzu模拟器完全配置与优化教程

专业指南&#xff1a;yuzu模拟器完全配置与优化教程 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上畅玩任天堂Switch游戏吗&#xff1f;yuzu模拟器为你提供了完美的解决方案。作为目前最受欢迎的开源Sw…...

puzzle(0312)找牛

目录 内固问题、最大内固问题 找牛 &#xff08;10&#xff09; &#xff08;17&#xff09; 内固问题、最大内固问题 参考内固、外固 寻找特定的内固集&#xff0c;即内固问题。 寻找最大内固数的内固集&#xff0c;即最大内固问题。 无向图的最大内固集&#xff08;即…...