首页 > 其他分享 >QT多线程基础

QT多线程基础

时间:2023-06-10 19:01:09浏览次数:41  
标签:include QT terminate 基础 线程 多线程 QThread 函数

(文章目录)


前言

本篇文章来讲解一下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函数,因为使用这个函数可能会出现意想不到的错误。

标签:include,QT,terminate,基础,线程,多线程,QThread,函数
From: https://blog.51cto.com/u_16153875/6455191

相关文章

  • 【pandas基础】--目录(完结)
    pandas基础内容的目录:概述pandas主要功能和应用场景的介绍。数据读取数据读取是第一步,只有成功加载数据之后,后续的操作才有可能。pandas可以读取和导入各种数据格式的数据,如CSV,Excel,JSON,SQL,HTML等,不需要手动编写复杂的读取代码。核心数据结构pandas最大的优势......
  • Python多线程编程的一个掉进去不太容易爬出来的坑
    原文复制过来很多图片不能显示,发个链接吧。是使用Python+Socket编程模拟FTP工作原理的代码,多线程会引入一个坑,使用多进程不存在这个问题。原文地址 ......
  • Qt 信号和槽出现重载的处理方法
    QtCreator+Qt5.12.2 1/*重载信号需要注明*/2connect(ui->comboBox_Mode,QOverload<int>::of(&QComboBox::currentIndexChanged),3this,[this](intindex)4{56});QOverload<int>::of(signal)东西比较简单直接看代......
  • C++的多线程编程(练习一下condition_variable)
        嗯,高考结束了,那就编写一个阅卷和查成绩的多线程吧。一个线程老师阅卷,其他三个线程查成绩。代码如下:    1#include<iostream>2#include<thread>3#include<mutex>4#include<condition_variable>5#include<chrono>6#include<futu......
  • C++基础题
    C++基础题水仙花数#include<iostream>usingnamespacestd;intmain(){cout<<"3位水仙花数:"<<endl;for(intnum=100;num<=999;num++){intdigit1=num/100;//百位数字intdigit2=(num/10)%10;......
  • Python+tkinter+多线程实现文本自动翻页方便阅读
    任务描述:使用Python编写程序,使用tkinter创建界面,使用ScrolledText显示任意文本,然后自动上下翻页方便阅读。参考代码:运行结果:公众号“Python小屋”......
  • JAVA基础语法
    Day03Java基础语法1.运算符运算符:对字面量或者变量进行操作的符号表达式:用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式例如:inta=10;intb=20;intc=a+b;+就叫做运算符a+b就叫表......
  • 从零玩转系列之微信支付实战基础框架搭建
    一、前言halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端)在此之前已经更新了微信支付开篇、微信支付安全......
  • python基础语法
    编码python3源码文件以utf-8编码,所有的字符去都是unicode。可以为源码指定不同的编码标识符第一个字符必须是字母或者下划线,不能是数字标识符的其他部分由字母、数字和下划线组成标识符首字母区分大小写标识符不能用python的保留字什么是标识符?标识符是用......
  • 《Linux基础及应用教程(基于CentOS7) 第2版》pdf电子书免费下载
    本书以CentOS 7为蓝本,分3篇介绍了Linux操作系统的使用和配置。操作基础篇介绍了Linux的基础知识、Linux系统的安装、Shell和字符操作界面的使用;系统与安全篇依次介绍了账户管理、权限管理、进程管理、存储管理、网络配置、网络工具、RPM包管理、基础架构服务、系统日常维护、服务......