QT多线程的使用

目录

一.介绍

二.第一种多线程方式

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 parentMyThread* 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.hqwc.cn/news/706143.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]肺结节检测数据集VOC+YOLO格式1186张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1186 标注数量(xml文件个数)&#xff1a;1186 标注数量(txt文件个数)&#xff1a;1186 标注…

贷款借钱平台 贷款源码 小额贷款系统 卡卡贷源码 小额贷款源码 贷款平台

贷款平台源码/卡卡贷源码/小贷源码/完美版 &#xff0c; 数据库替换application/database.php 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89268533 更多资源下载&#xff1a;关注我。

绝地求生:29.2商城更新内容预览:挣脱尘网通行证,经典皮肤返场,空投活动

就在今天历经9小时维护&#xff0c;29.2版本终于上线&#xff0c;柠檬茶带大家一起看看&#xff0c;这次游戏里都更新了哪些内容吧。 挣脱尘网通行证 豪华版&#xff1a;$14.99 普通版&#xff1a;$4.99 豪华版比普通版多10级升级券和2套生存者宝箱 分支一 分支二 分支三 额外…

PostMan 测试

创建一个集合管理测试接口 token获取 Tests&#xff1a;后置脚本 Api 请求后的操作&#xff0c;一般写断言脚本的地方 Pre-request Script &#xff1a;后置脚本 请求前的操作 以下代码放进Tests 后置脚本当中。 var respObj JSON.parse(responseBody); // 获取到TOK…

自定义类似vite的命令行

一、第一步 随便新建一个文件夹&#xff0c;终端执行npm init&#xff0c;生成如图的结构 其中name就是命令行的名字 二、第二步 新建一个js文件&#xff0c;在其顶部加入这串代码#!/usr/bin/env node,#!就是告诉系统这个是可执行脚本,/usr/bin/env就是系统环境变量&#x…

总结5.15

今日做了一场华为机试&#xff0c;三道题&#xff0c;一道通过率95%&#xff0c;一道45%。在过去的一段时间里&#xff0c;我彻底迷失了自我&#xff0c;没有自我的一个规划&#xff0c;也不知道怎么走出来。 后来&#xff0c;我想借助网络的力量&#xff0c;去知乎上寻找能点…

其实解决问题的方法很简单

大家好&#xff01;我是编码小哥&#xff0c;欢迎关注&#xff0c;持续分享更多实用的编程经验和开发技巧&#xff0c;共同进步&#xff01; 本例是一个动态数组的例子&#xff0c;实现数据的增加、删除、根据索引修改数值、获取数值。 dynamic_array.c #include "dy…

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

WebRTC实时音视频通话之语音通话设计与实践

一、背景 在移动互联网流量时代&#xff0c;很多业务场景都有音视频通信的需求&#xff0c;比如IM场景&#xff0c;除了文字交流还需要音视频通话进行实时交互。为了帮助58、赶集、安居客等业务线更好的为用户提供服务&#xff0c;节约沟通成本&#xff0c;提升效率&#xff0…

Qt编译和使用freetype矢量字库方法

在之前讲过QT中利用freetype提取字库生成图片的方法&#xff1a; #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段&#xff0c;结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…

CSS引入方式

CSS引入方式 1 行内式2 内嵌式3 连接式/外部样式表 1 行内式 行内式,通过元素开始标签的style属性引入 样式语法为&#xff1a; 样式名:样式值; 样式名:样式值; 代码 <input type"button" value"按钮"style"display: block;width: 60px; height: 4…

45°和68°焕新上市,五粮液完成产品体系化布局

执笔 | 尼 奥 编辑 | 扬 灵 如今&#xff0c;白酒行业正经历周期性调整&#xff0c;头部化和品牌化集中趋势日益显著。五粮液在这一关键时刻&#xff0c;敏锐地捕捉到市场机遇&#xff0c;通过产品焕新&#xff0c;进一步完善和丰富了其代际系列产品体系。 这一举措不仅巩…