Qt 多线程用法

文章目录

  • 开发平台
  • QThread 类 + moveToThread
  • QtConcurrent::run + QFutureWatcher
  • QThreadPool + QRunnable

开发平台

项目说明
OSwin10 x64
Qt6.6
compilermsvc2022
构建工具cmake

在这里插入图片描述

QThread 类 + moveToThread

写一个简单的例子吧,比较容易理解,方便入门. 也可以看出这种方式,对于线程的开销会比较大,但可以自己设置外部的 线程对象, 以达到复用或者减少开销的目的,但不如用线程池来的直接

#include <QApplication>
#include <QThread>
#include <QtConcurrent>class MyWork : public QObject
{Q_OBJECT
public:MyWork() {this->moveToThread(&thread);thread.start();connect(this,&MyWork::startSignal,this,&MyWork::run);connect(&thread,&QThread::finished,this,[]{qDebug() << "Thread::finished";});connect(&thread,&QThread::destroyed,qApp,[]{qDebug() << "Thread::destroyed";});}~MyWork(){if(thread.isRunning())thread.terminate();qDebug() << "~MyWork()";}void start() {emit startSignal();}void stop(){running = false;if(thread.isRunning())thread.quit();}void run() {static int i = 0;while(running) {QThread::msleep(1000);qDebug() << i++ << ":" << QThread::currentThreadId();}}signals:void startSignal();void stopSignal();private:QThread thread;bool running = true;
};int main(int argc, char** argv) {QApplication a(argc,argv);qDebug() << QThread::currentThreadId();MyWork mw;mw.start();QTimer::singleShot(3000,[&mw]{mw.stop();});QTimer::singleShot(4000,qApp, SLOT(quit()) );return a.exec();
}#include "main.moc"  // 这一句很重要,因为是写在main.cpp里面的,注意编译器的输出提示

QtConcurrent::run + QFutureWatcher

在 Qt 6 中, QtConcurrent::run 的函数原型中,已经没有 对象指针,即调用成员函数的时候, 要么使用 Lambda 对象 ,要么使用 std::bind 方法
这种方式感觉比较方便,但实际应用起来没有那么美好,属于后期为了改善效率,匆忙添加的手段

#include <QApplication>
#include <QThread>
#include <QTimer>
#include <qDebug>
#include <QtConcurrent>class MyWork  {QFutureWatcher<void> w;bool isRun = false;
public:MyWork() {qDebug() << " MyWork()";QObject::connect(&w, &QFutureWatcher<void>::finished, &w, []{qDebug() << "QFutureWatcher<void>::finished";});}~MyWork(){qDebug() << " ~MyWork()";}void start() {isRun = true;auto fun =  std::bind(&MyWork::run, this );auto ret = QtConcurrent::run( fun );// auto ret = QtConcurrent::run([this]{//     run();// });w.setFuture(ret);}void stop(){isRun = false;}void run() {int i = 0;while(isRun) {QThread::msleep(1000);qDebug() << i++ << ":" << QThread::currentThreadId();}}
};
int main(int argc, char** argv) {QApplication a(argc,argv);qDebug() << ":" << QThread::currentThreadId();MyWork mw;mw.start();QTimer::singleShot(3000, [&mw]{mw.stop();});QTimer::singleShot(5000, []{qDebug() << "qApp->quit();";qApp->quit();});return a.exec();
}

QThreadPool + QRunnable

继承 QRunnable, 重写 run
QThreadPool::globalInstance()->start(this);
清晰明了, QThreadPool 提供了 线程的管理,不需要自己去写一个管理器

#include <QApplication>
#include <QtConcurrent>class MyWork :public QRunnable {bool isRun = false;
public:MyWork() {// setAutoDelete(false);qDebug() << " MyWork()";}~MyWork(){qDebug() << " ~MyWork()";}void start(){isRun = true;QThreadPool::globalInstance()->start(this);}void stop(){isRun = false;}void run() {int i = 0;while(isRun) {QThread::msleep(1000);qDebug() << i++ << ":" << QThread::currentThreadId();}}
};
int main(int argc, char** argv) {QApplication a(argc,argv);qDebug() << ":" << QThread::currentThreadId();// MyWork mw ;// mw.start();MyWork *mw = new MyWork;mw->start();QTimer::singleShot(3000, [mw]{mw->stop();});QTimer::singleShot(6000, []{qApp->quit();});return a.exec();
}

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

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

相关文章

基于SSM框架的二手房中介管理系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于二手房信…

达梦到达梦的外部链接dblink(DM-DM DBLINK)

一. 使用场景&#xff1a; 部链接对象&#xff08;LINK&#xff09;是 DM 中的一种特殊的数据库实体对象&#xff0c;它记录了远程数据库的连接和路径信息&#xff0c;用于建立与远程数据的联系。通过多台数据库主库间的相互通讯&#xff0c;用户可以透明地操作远程数据库的数…

25年老品牌 美好蕴育润康守护孕期妈妈的健康之路

孕期是每一位女性人生中最为特殊的阶段。每一位妈妈都期待着健康、快乐的度过每一天。然而&#xff0c;随着孕周的增加&#xff0c;孕期的不适和困扰也随之而来。孕吐、腰酸背痛、便秘等孕期症状让许多妈妈倍感疲惫和焦虑。在这个关键时刻&#xff0c;美好蕴育润康作为25年的老…

JSON Web Token JWT几种简单的绕过方法

JWT结构 JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。 这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 JWT常被用于前后端分离&#xff0c;可以和Restful API配合使用&#xff0c;常用于构建身份认证机制 如图为JWT加密后的示例&…

万德高科携手航天科技AIRIOT打造智慧能碳管理平台, 助力碳达峰碳中和

“十四五”时期&#xff0c;我国生态文明建设进入了以降碳为重点战略方向、推动减污降碳协同增效、促进经济社会发展全面绿色转型、实现生态环境质量改善由量变到质变的关键时期。“实施数字化赋能行动”&#xff0c;聚焦能源管理、节能降碳、低碳能力等典型场景&#xff0c;推…

【前缀和】【单调栈】LeetCode2281:巫师的总力量和

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 作为国王的统治者&#xff0c;你有一支巫师军队听你指挥。 给你一个下标从 0 开始的整数数组 strength &…

CH06_访问数据结构

Visitor 模式 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的提前下定义作用于这些元素的新操作。 类图 说明 Visitor&#xff08;访问者&#xff09; Visitor角色负责对数据结构中每一个…

机器学习:手撕 AlphaGo(一)

图 1-1: AphaGo 结构概览 1. 前言 AlphaGo 是一个非常经典的模型&#xff0c;不论从影响力还是模型设计上。它的技术迭代演进路径&#xff1a;AlphaGo&#xff0c;AlphaGoZero&#xff0c;AlphaZero&#xff0c;MuZero 更是十分精彩。相信有很多同学因为听了 AlphaGo 的故事对…

IDEA创建springboot工程

选择spring boot的版本和依赖 finish创建完成 删除无用的文件

Linux 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持Centos7,8,9/Redhat7,8,9及复刻系列download TeamCity TeamCity 文档参考TeamCity downloaddownloadTeamCi…

PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)

十多年前开发框架时&#xff0c;为了效率不断试过各种代码写法&#xff0c;今天又遇到了&#xff0c;想想php8时代会不会有所变化&#xff0c;结果其实也还是和当年一样&#xff0c;但当年没写博客&#xff0c;但现在可以把数据记录下来了。 PHP_loop_ireflies_dark_forest 项目…

泽攸科技SEM台式扫描电子显微镜

泽攸科技是一家国产的科学仪器公司&#xff0c;专注于研发、生产和销售原位电镜解决方案、扫描电镜整机、台阶仪、探针台等仪器。目前台式扫描电镜分为三个系列&#xff1a;ZEM15、ZEM18、ZEM20。 ZEM15台式扫描电镜&#xff1a; ZEM18台式扫描电镜&#xff1a; ZEM20台式扫描…