QT多线程基础

news2025/5/12 23:31:22

文章目录

  • 前言
  • 一、多线程概念介绍
  • 二、创建一个线程
  • 三、start和terminate函数
  • 四、如何不使用terminate函数终止线程
  • 总结


前言

本篇文章来讲解一下QT中的多线程使用方法。

其实线程这个概念对于我们来说并不陌生,main函数在多线程中一般就被称为主线程。

在QT中,使用QThread类可以方便地创建新的线程并在其中执行任务。以下介绍一些常用的QT多线程的技术和方法。

一、多线程概念介绍

多线程是指一个进程中包含至少两个执行流,即多个线程,每个线程都可以独立运行,访问该进程中的共享资源,并且可以与其它线程同步行动。多线程应用程序通常比单线程应用程序具有更好的响应速度和更好的资源利用率,适合于一些需要高效处理大量数据和执行复杂任务的场景。

在多线程应用中,程序的执行流被抽象为线程,每个线程都有自己的执行上下文,包括寄存器、堆栈和程序计数器等,线程之间共享进程地址空间中的数据和资源。线程之间的通信和同步主要通过共享内存和同步原语来实现,如信号量、互斥锁和条件变量等。

多线程可以提高程序效率,但也会增加线程的并发开销和线程安全问题。

二、创建一个线程

在QT中创建一个线程需要使用到QThread的这个类。

这里定义一个Mythread类这个类继承自QThread,要想使用多线程我们需要重写run()函数,run()函数就是线程执行的主体,将需要处理的逻辑放入run函数中执行即可。

#include <QCoreApplication>
#include <QDebug>
#include <QThread>

class Mythread : public QThread
{
protected:
    void run()
    {
        for(int i = 0; i < 5; i++)
        {
            qDebug() << "Mythread";
            sleep(1);   //休眠1s
        }
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Mythread t1;

    t1.start();

    for(int i = 0; i < 5; i++)
    {
        qDebug() << "Main Thread";
        QThread::sleep(1);   //休眠1s
    }


    return a.exec();
}

执行效果:
在这里插入图片描述
可以看到主线程和创建出来的线程并发执行互不干扰。

三、start和terminate函数

QThread 类在启动新线程时使用 start() 函数,该函数的作用是将 run() 函数放入一个新线程并在新线程中启动执行代码。根据 Qt 的官方文档,start() 函数应该被认为是线程对象的构造函数,因为每次调用 start() 函数都会生成一个新的线程对象。

当需要中止线程时,terminate() 是一个用于中止线程的函数。但建议不要使用 terminate() 函数,在大多数情况下这会导致未定义的行为,而且可能会造成数据损失或未同步的状态。terminate()函数是暴力终止线程的方法,他是直接让线程终止,并不会等到线程退出后再将线程结束,在实际开发中一般不建议使用这个函数。

四、如何不使用terminate函数终止线程

解决方法:设置一个标志位当需要终止线程时设置这个标志位。

在Mythread中提供一个标志位变量,并且提供一个stop()函数,当需要将线程终止时将这个m_stop设置为true即可。

#include <QCoreApplication>
#include <QDebug>
#include <QThread>

class Mythread : public QThread
{
    bool m_stop;
protected:
    void run()
    {
        for(int i = 0; (!m_stop) && (i < 5); i++)
        {
            qDebug() << "Mythread";
            sleep(1);   //休眠1s
        }
    }

public:
    void stop()
    {
        m_stop = true;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Mythread t1;

    t1.start();

    for(int i = 0; i < 5; i++)
    {
        qDebug() << "Main Thread";
        QThread::sleep(1);   //休眠1s
        if(i == 3)
        {
            t1.stop();
        }
    }


    return a.exec();
}

运行效果:
在这里插入图片描述

总结

多线程是非常重要的一个知识点,大家需要将他掌握,需要注意的就是终止线程时不要使用terminate函数,因为使用这个函数可能会出现意想不到的错误。

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

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

相关文章

《计算机网络—自顶向下方法》 第四章Wireshark实验:TCP 协议分析

在因特网协议族&#xff08;Internet Protocol Suite&#xff09;中&#xff0c;TCP 层是位于 IP 层之上&#xff0c;应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接&#xff0c;但是 IP 层不提供这样的流机制&#xff0c;而是提供不可靠的包交换。…

Ordinal 是什么? BTC NFT 解释

Ordinal NFT 于 2023 年 1 月 20 日由开发者 Casey Rodarmor 在 BTC 主网上推出&#xff0c;它是在 BTC上 创建 NFT 的最新方式。虽然 BTC 上的 NFT 并不是一个新概念&#xff0c;BTC 之上的第 2 层网络&#xff08;例如 Counterparty 和 Stacks&#xff09;已经支持基于 BTC 的…

第七届中华梦乡·福清石竹山梦文化节举办

第七届中华梦乡福清石竹山梦文化节现场 5月9日至12日&#xff0c;第七届中华梦乡福清石竹山梦文化节暨海峡两岸&#xff08;福清&#xff09;道教论坛在福州福清举办。本届梦文化节以“福佑中华 梦圆石竹”为主题&#xff0c;旨在发挥海峡两岸道教界同根同源、联系密切的独特优…

【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(二)

博主&#xff1a;命运之光 专栏&#xff1a;Java零基础入门 学习目标 1.了解什么是抽象类&#xff0c;什么是接口&#xff1b; 2.掌握抽象类和接口的定义方法&#xff1b; 3.理解接口和抽象类的使用场景&#xff1b; 4.掌握多态的含义和用法&#xff1b; 5.掌握内部类的定义方法…

【HBase】介绍

文章目录 什么时候用Hbase&#xff1f;常见应用场景逻辑结构物理结构数据模型Name Space TableRowColumnTime StampCell 存储设计HLogHFileHfile生成方式 Apache HBase™ 是以 hdfs 为数据存储的&#xff0c;一种分布式、可扩展的 NoSQL 数据库。 Bigtable 是一个稀疏的、分布式…

5项目五:W1R3S-1(思路为主!)

特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#xff0c;如使用者用来从事违法犯罪行为&#xff0c;一切与作者无关。 目录 前言 一、信息收集 二、网页信息的收集 三、提权 总结 前言 思路清晰&#xff1a; 1.信息收集&#xff0c;…

《程序员面试金典(第6版)》面试题 16.19. 水域大小(深度优先搜索,类似棋盘类问题,八皇后的简化版本,C++)

题目描述 你有一个用于表示一片土地的整数矩阵land&#xff0c;该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小&#xff0c;返回值需要从小到…

【数据结构与算法】图的遍历与拓扑排序

文章目录 一、用数组模拟邻接表二、图的深度优先遍历&#xff08;dfs&#xff09;2.1 概念2.2 例题&#xff1a;树的重心 三、图的广度优先遍历&#xff08;bfs&#xff09;3.1 概念3.2 例题&#xff1a;图中点的层次 四、拓扑排序4.1 概念4.2 例题&#xff1a;有向图的拓扑序列…

2直接连接的网络与VLAN划分-2.2【实验】【计算机网络】

2直接连接的网络与VLAN划分-2.2-2.3【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网2.2交换机MAC地址表建立与帧转发实验目的实验内容及实验环境实验原理交换机通过逆向学习帧的源地址&#xff0c;构建MAC地址表;交换机中MAC地址的构建…

netty基础(五)

1.基本介绍 1>.异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者; 2>.Netty中的I/O操作是异步的,包括Bind、Write、Connect等操作会简单的返回一个 ChannelFuture; 3>.调用…

二、Eureka注册中心

目录 注册中心主要有三种角色&#xff1a; 1、服务提供者&#xff08;RPC Server&#xff09; 2、服务消费者&#xff08;RPC Client&#xff09; 3、服务注册中心&#xff08;Registry&#xff09; 注册中心实现原理 常用的注册中心&#xff1a; 常用注册中心对比&…

【C/C++每日一练】总目录(更新至2023.5.12)

C/C 2023.05 2023.5.11-2023.5.12 20230512 1. 成绩打印 ※ 2. 按要求补齐数组 &#x1f31f;&#x1f31f;&#x1f31f; 3. 水仙花数 ※ 20230511 1. 最长公共前缀 &#x1f31f; 2. 打家劫舍 &#x1f31f;&#x1f31f; 3. 最接近的三数之和 &#x1f31f;&am…

修改通过CDH安装的Kafka和Zookeeper等组件的最大文件句柄数

目录 1.查看当前kafka最大文件句柄数 2.修改supervisord.service 服务配置文件 3.加载配置文件 4.重启supervisord.service服务 5.重启kafka等组件 6.查看修改后最大文件句柄数 7.查看kafka当前使用的文件句柄数 参考&#xff1a; 1.查看当前kafka最大文件句柄数 jpsc…

【rust】| 05——语法基础 | 流程控制

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 流程控制1. 条…

双向链表的功能实现

前言&#xff1a;我们已经学习并知道了单链表的实现&#xff0c;链表的实现方式不只是单链表一种&#xff0c;今天我们就来介绍一种新的结构&#xff0c;就是双链表结构&#xff0c;本质上是将节点间进行双向链接&#xff0c;从而使一些操作更加容易实现。 目录 1.双向链表的简…

OpenCL编程指南-3.3类型转换

隐式类型转换 隐式类型转换是一种自动的类型转换&#xff0c;只要混合使用不同的类型&#xff0c;编译器就会完成这种隐式类型转换。这里支持表4-1中定义的标量类型&#xff08;除void、double和half以外&#xff09;的隐式转换。完成隐式转换时&#xff0c;并不只是重新解释一…

MySQL:数据库的增删查改

我们这一篇主要介绍数据库的增删查改~ 增&#xff1a;insert into 表名 value (); 删&#xff1a;delete from 表名; 查&#xff1a;select from 表名; 改&#xff1a;update 表名; 目录 1.insert&#xff08;增&#xff09; 2.select&#xff08;查询&#xff09; 2.1 全列…

Goby 漏洞更新 |Telesquare TLR-2005Ksh 路由器 ExportSettings.sh 文件下载漏洞(CVE-2021-46423)

漏洞名称&#xff1a;Telesquare TLR-2005Ksh 路由器 ExportSettings.sh 文件下载漏洞&#xff08;CVE-2021-46423&#xff09; English Name&#xff1a;Telesquare TLR-2005Ksh ExportSettings.sh file download (CVE-2021-46423) CVSS core: 7.5 影响资产数&#xff1a;2…

勒索病毒“顽疾”,没有“特效药”吗?

基础设施瘫痪、企业和高校重要文件被加密、毕业论文瞬间秒没……这就是六年前的今天&#xff0c;WannaCry勒索攻击爆发时的真实场景。攻击导致150多个国家数百万台计算机受影响&#xff0c;也让勒索病毒首次被全世界广泛关注。 六年后&#xff0c;勒索攻击仍是全球最严重的网络…

bootp引导程序协议

bootp又称为引导程序协议,我们来简单了解一下这个协议以及他的用法。 1&#xff0c;BOOTP 请求和应答均被封装在 U D P数据报中 &#xff1b; 2&#xff0c;B O O T P使用 U D P&#xff0c;且通常需与 T F T P协同工作&#xff1b; 3&#xff0c;B O O T P有两个熟知端口&a…