QT多线程的使用

news2024/12/23 23:52:54

目录

一.介绍

二.第一种多线程方式

1.创建一个线程子类,继承QT中的QThread

2.重新父类的run( )方法

3.在线程中创建子线程对象

4.run( )方法

5.启动子线程

三.第二种多线程方式

1.创建一个新类(这个类是QObject的派生)

2.在这个类中添加一个公共成员函数

3.主线程中创建一个QThread对象(子线程对象)

4.主线程中创建工作的类对象

5.将工作的类移动到子线程中,启动子线程

6.让工作的对象开始工作

7.工作函数

四.效果演示

五.代码演示

第一种线程方法

第二种线程方法

六.总结


一.介绍

QT中的线程用于实现多任务并发执行,提高程序的执行效率和响应速度

在QT中,线程是进行运算调度的最小单位,它们包含在进程之中并作为进程中的实际运作单位。使用线程的主要目的是让程序能够同时执行多个任务。以下是QT线程的主要作用和使用方式:

  • 提高性能和响应速度:通过将耗时的操作放在单独的线程中执行,可以避免UI冻结,提高应用程序的响应速度。
  • 实现多任务处理:一个进程中可以并发运行多个线程,每条线程并行执行不同的任务,有效地利用了计算机多核处理器的能力。
  • 简化复杂操作:对于需要长时间运行或复杂的计算,使用线程可以使主线程保持不被阻塞,从而不影响用户界面的交互性。
  • 跨平台支持:QT提供的线程类如QThread、QThreadStorage等,都是跨平台的,可以在不同操作系统中使用。
  • 提供线程安全的通信机制:QT支持线程安全的事件投递、跨线程的信号-槽连接,使得不同线程间的通信变得安全高效。

QT通过提供一系列与线程相关的类和方法,使得在应用程序中创建和管理线程变得相对简单。这包括继承QThread类并重写其run()方法来定义线程的行为,以及使用Qt的信号和槽机制来处理线程间通信。

二.第一种多线程方式

1.创建一个线程子类,继承QT中的QThread

2.重新父类的run( )方法

3.在线程中创建子线程对象

4.run( )方法

5.启动子线程

三.第二种多线程方式

1.创建一个新类(这个类是QObject的派生)

2.在这个类中添加一个公共成员函数

.

3.主线程中创建一个QThread对象(子线程对象)

4.主线程中创建工作的类对象

5.将工作的类移动到子线程中,启动子线程

6.让工作的对象开始工作

7.工作函数

四.效果演示

五.代码演示

第一种线程方法

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QDebug>
#include <QVector>
#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);

protected:
    void run();

signals:
    //自定义信号,传递数据
    void curNumber(int num);

public slots:

private:

};


#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"
#include <QDebug>

MyThread::MyThread(QObject *parent) : QThread(parent)
{

}


void MyThread::run()
{
    qDebug() << "当前线程对象的地址: " << QThread::currentThread();

    int num = 0;

    while(1)
    {

        emit curNumber(num++);
        if(num == 10000000){
            break;
        }
        QThread::usleep(1);
    }
    qDebug() << "run() 执行完毕, 子线程退出...";
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qDebug()<<"主线程对象地址"<<QThread::currentThread();


    //创建子线程
    MyThread* subThread = new MyThread;


    connect(subThread,&MyThread::curNumber,this,[=](int num){
        ui->label->setNum(num);
    });


    connect(ui->startBtn, &QPushButton::clicked, this, [=]()
            {
                // 启动子线程
                subThread->start();
            });

}

MainWindow::~MainWindow()
{
    delete ui;
}

第二种线程方法

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QDebug>


class MyThread : public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);



    void working();

signals:
    //自定义信号,传递数据
    void curNumber(int num);

public slots:

private:

};


#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"
#include <QDebug>
#include <QThread>

MyThread::MyThread(QObject *parent) : QObject(parent)
{

}

void MyThread::working()
{
    qDebug() << "当前线程对象的地址: " << QThread::currentThread();

    int num = 0;
    while(1)
    {
        emit curNumber(num++);
        if(num == 10000000)
        {
            break;
        }
        QThread::usleep(1);
    }
    qDebug() << "run() 执行完毕, 子线程退出...";
}


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include <QDebug>
#include <QThread>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    qDebug()<<"主线程对象地址"<<QThread::currentThread();

    //创建线程对象
    QThread* sub = new QThread;
    //创建工作类对象
    //千万不要指定给创建的对象指定父对象
    //如果指定了: QObject::moveToThread: Cannot move objects with a parent
    MyThread* work = new MyThread;
    // 将工作的类对象移动到创建的子线程对象中
    work->moveToThread(sub);
    //启动线程
    sub->start();

    // 让工作的对象开始工作, 点击开始按钮, 开始工作
    connect(ui->startBtn, &QPushButton::clicked, work, &MyThread::working);
    //显示数据
    connect(work,&MyThread::curNumber,this,[=](int num){
        ui->label->setNum(num);
    });



}


MainWindow::~MainWindow()
{
    delete ui;
}

六.总结

继承QThread的方法只有重写run函数里的内容在子线程里运行,其他部分比如定时器的槽函数在主线程里运行。
MoveToThread的方法,所有的槽函数都在子线程里运行。

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

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

相关文章

QT:QML与C++交互

目录 一.介绍 二.pro文件添加模块 三.h文件 四.cpp文件 五.注册 六.调用 七.展示效果 八.代码 1.qmlandc.h 2.qmlandc.cpp 3.main.cpp 4.qml 一.介绍 在 Qt 中&#xff0c;QML 与 C 交互是非常重要的&#xff0c;因为它允许开发人员充分利用 QML 和 C 各自的优势&…

JVM运行时内存:程序计数器

文章目录 1. 程序计数器的作用2. 程序计数器的基本特征3. 程序计数器的问题 运行时内存整体结构如下图所示: 1. 程序计数器的作用 为了保证程序(在操作系统中理解为进程)能够连续地执行下去&#xff0c;CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作…

【idea】idea插件 通过文档注释生成swagger,easyexcel注解

前言&#xff1a;博主的第二个idea插件审核通过啦 (第一个插件是equals inspection) idea的plugin marketplace搜swagger excel doc即可下载安装 ​功能&#xff1a;通过文档注释生成easy Excel或swagger注解 &#xff08;快捷键altins&#xff09; ​实际场景&#xff1a;vo返…

实锤,阿里云盾会拦截百度云防护的IP!

今天凌晨&#xff0c;一位站长联系上云加速客服&#xff0c;反馈说&#xff0c;网站突然出现了502的情况。 在检查云防护子域名配置没有问题、本地强制回源没有问题的情况下&#xff0c;我们得出结论是要么服务器内防火墙拦截了云防护的IP段&#xff0c;要么服务器商拦截了云防…

Android 10.0 Launcher3定制folder文件夹2x2布局之三foldericon的2x2的布局后拖拽只能停放在右边的问题修复

1.前言 在10.0的系统rom产品定制化开发中,在对Launcher3的folder文件夹功能定制中,要求folder文件夹跨行显示,就是 2x2布局显示,默认的都是占1格的,现在要求占4格显示,系统默认是不支持显示4格的,所以接下来需要分析相关的 功能,然后来实现这个功能 2.Launcher3定制fo…

点量云流分享:关于实时渲染云推流技术

提到云串流或者云推流很多人可能和游戏关联起来&#xff0c;其实这个技术的应用领域不仅仅是游戏&#xff0c;还有云上旅游、考古、智慧园区、智慧城市、虚拟仿真等等行业。其解决的问题是将一些大型的3D应用程序放在云端&#xff0c;程序在运行的时候也是在云端&#xff0c;这…

Python学习之路 | Python基础语法(一)

数据类型 Python3 中常见的数据类型有&#xff1a; Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dict…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

颜色的表示和还原(一)

这篇文章主要提炼于ICCV 2019 Tutorial: Understanding Color and the In-Camera Image Processing Pipeline for Computer Vision。里面深入浅出地讲解了很多ISP中的基础知识&#xff0c;这里主要对颜色相关的部分做一点总结。 假设不成立了 相机经常被简单地看作是衡量光线…

Qwen学习笔记4:Qwen 7B模型调用天气API实现天气的实时查询

前言 在学习Qwen模型的函数调用功能后&#xff0c;进一步尝试利用本地的Qwen模型访问OpenWeather API来获取实时的天气情况。 参考代码来源于视频教程&#xff1a; 简单粗暴&#xff0c;轻松配置Qwen模型查询实时数据功能_哔哩哔哩_bilibili 说明 该代码运行前&#xff0c…

线性系统(二)

线性系统&#xff08;二&#xff09; 1.直观理解线性方程组结构2. 不同解的结论3. 更一般的高斯-约旦消元法4.齐次线性方程组 链接: 线性系统&#xff08;一&#xff09; 1.直观理解线性方程组结构 长这样&#xff0c;方程就有解&#xff0c;即相交坐标。 长这样&#xff0c;…

Python | Leetcode Python题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 设置 dummyNode 是这一类问题的一般做法dummy_node ListNode(-1)dummy_node.next headpre dummy_nodefor _ in range(left - 1):pre…

Cadence 16.6 PCB Edito如何将鼠标中键反向拉拽改为正向拖拽

Cadence 16.6 PCB Editor如何将鼠标中键反向拉拽改为正向拖拽 Cadence 16.6 PCB Editor默认鼠标中键是反向的拉拽&#xff0c;让我很不适应&#xff0c;在网上找的可行的方法&#xff0c;在这里总结出来&#xff0c;希望能帮到其他工程师。 按照以下步骤进行操作&#xff1a; …

设计模式:外观模式(Facade)

设计模式&#xff1a;外观模式&#xff08;Facade&#xff09; 设计模式&#xff1a;外观模式&#xff08;Facade&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

Golang | Leetcode Golang题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; func numDecodings(s string) int {n : len(s)// a f[i-2], b f[i-1], c f[i]a, b, c : 0, 1, 0for i : 1; i < n; i {c 0if s[i-1] ! 0 {c b}if i > 1 && s[i-2] ! 0 && ((s[i-2]-0)*10(s[i-1]-0) < 26) {c…

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal&#xff1a;S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…

机器学习—聚类算法

聚类算法 小白的机器学习笔记 2024/5/15 9:52 文章目录 聚类算法步骤K-means算法优缺点 示例 聚类算法的核心思想&#xff1a; 样本点到每个中心点的距离&#xff0c;最近的就是这个类 步骤 要聚成3类&#xff0c;先初始化3个点 第一步大致确定类别 第二步更新中心点 第三…

Vue的学习 —— <网络请求库Axios>

目录 前言 正文 一、Axios基本概念 二、安装Axios 三、Axios使用方法 四、向服务器发送请求 前言 在之前的开发案例中&#xff0c;我们通常直接在组件中定义数据。但在实际的项目开发中&#xff0c;我们需要从服务器获取数据。当其他用户希望访问我们自己编写的网页时&a…

AI绘画Midjourney 和 Stable Diffusion的区别是什么?如何使用和安装?超详细AI绘画小白零基础入门教程建议收藏!(附资料)

大家好&#xff0c;我是画画的小强 关于AI绘画&#xff0c;大家多多少少都听过Midjourney 和 Stable Diffusion的大名&#xff0c;号称目前市面上最强的两款AI绘画软件。那么今天我们就来分析一下这两款软件的区别在哪里。 Midjourney是一个在线网站&#xff0c;使用它需要用…