尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Qt 一次性把多线程实现方式说清楚

Qt 一次性把多线程实现方式说清楚
📅 发布时间:2026/7/17 6:45:29

一、方式1

1.继承QThread,重写run()方法:

1)QThread 是底层线程管理类,默认run()会调用exec()开启线程事件循环;

2)重写run()函数,调用start()启动线程。

2.测试

CustomThread.h

#ifndef CUSTOMTHREAD_H #define CUSTOMTHREAD_H #include <QThread> #include <QObject> #include <QDebug> //自定义线程类 class CustomThread : public QThread { Q_OBJECT protected: void run() override { qDebug() << "继承QThread 子线程ID:" << QThread::currentThreadId(); //模拟耗时任务 msleep(1000); emit taskFinish(); } signals: void taskFinish(); }; #endif // CUSTOMTHREAD_H

main.cpp

#include <QCoreApplication> #include <QThread> #include <QRunnable> #include <QThreadPool> #include <QtConcurrent/QtConcurrent> #include <QDebug> #include <thread> #include <chrono> #include "CustomThread.h" //在main中调用 void demo_QThread_Inherit() { CustomThread t; QObject::connect(&t, &CustomThread::taskFinish, [](){ qDebug() << "继承QThread任务执行完毕"; }); t.start(); //启动子线程 t.wait(); //主线程阻塞等待线程结束 } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main start"; qDebug() << "主线程ID" << QThread::currentThreadId(); demo_QThread_Inherit(); qDebug() << "main end"; return 0; //return a.exec(); }

二、方式2

1.QObject + moveToThread():

1)创建纯业务工作类(Worker)继承QObject,通过moveToThread(thread)将整个对象移动到子线程事件循环;

2)通过信号槽跨线程通信(Qt 自动队列连接),保证槽函数在子线程执行。

2.测试

Worker.h

#ifndef WORKER_H #define WORKER_H #include <QObject> #include <QThread> #include <QDebug> //工作对象(纯业务,无线程继承) class Worker : public QObject { Q_OBJECT public slots: void doTask(int num) { qDebug() << "moveToThread 子线程ID:" << QThread::currentThreadId() << "参数:" << num; QThread::msleep(1000); emit taskDone(num * 2); } signals: void taskDone(int res); }; #endif // WORKER_H

main.cpp

#include <QCoreApplication> #include <QThread> #include <QRunnable> #include <QThreadPool> #include <QtConcurrent/QtConcurrent> #include <QDebug> #include <thread> #include <chrono> #include "Worker.h" //在main中调用 void demo_moveToThread() { QThread* workThread = new QThread; Worker* worker = new Worker; worker->moveToThread(workThread); //任务启动 QObject::connect(workThread, &QThread::started, worker, [worker](){ worker->doTask(100); }); //任务完成,退出线程 QObject::connect(worker, &Worker::taskDone,[](int res) { qDebug() << "moveToThread 函数执行完毕 res:"<< res; }); //清理内存 QObject::connect(workThread, &QThread::finished, worker, &QObject::deleteLater); QObject::connect(workThread, &QThread::finished, workThread, &QObject::deleteLater); //开启线程 workThread->start(); workThread->quit(); workThread->wait(); //正确阻塞等待线程完全结束 } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main start"; qDebug() << "主线程ID" << QThread::currentThreadId(); demo_moveToThread(); qDebug() << "main end"; return 0; //return a.exec(); }

三、方式3

1.QThreadPool + QRunnable:

1)QRunnable:封装单次任务,QThreadPool 复用线程,避免反复创建销毁线程开销;

2)globalInstance() 使用全局共享线程池,也可创建局部独立线程池;

3)默认自动销毁 QRunnable(autoDelete=true)。

2.测试

main.cpp

#include <QCoreApplication> #include <QThread> #include <QRunnable> #include <QThreadPool> #include <QtConcurrent/QtConcurrent> #include <QDebug> #include <thread> #include <chrono> //任务封装类 class RunTask : public QRunnable { public: explicit RunTask(int id) : m_id(id) {} void run() override { qDebug() << "QThreadPool 任务" << m_id << "线程ID:" << QThread::currentThreadId(); QThread::msleep(800); } private: int m_id; }; //在main中调用 void demo_QRunnable_Pool() { QThreadPool* pool = QThreadPool::globalInstance(); pool->setMaxThreadCount(4); //设置最大并发线程 //提交5个任务,自动复用线程 for(int i = 1; i <= 5; i++) { pool->start(new RunTask(i)); //autoDelete默认true,执行完自动释放 } pool->waitForDone(); // 阻塞等待所有任务完成 qDebug() << "线程池全部任务结束"; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main start"; qDebug() << "主线程ID" << QThread::currentThreadId(); demo_QRunnable_Pool(); qDebug() << "main end"; return 0; //return a.exec(); }

四、方式4

1.QtConcurrent 高级并发API,需要添加在pro文件中concurrent模块:

1)QtConcurrent模块提供高层并发函数,底层基于QThreadPool,无需手动管理线程;

2)QtConcurrent::run:运行任意函数或lamdba;

3)QtConcurrent::map/filter/reduce:批量容器并行运算;

4)返回QFuture 用于等待/获取结果、进度监控。

2.测试

main.cpp

#include <QCoreApplication> #include <QThread> #include <QRunnable> #include <QThreadPool> #include <QtConcurrent/QtConcurrent> #include <QDebug> #include <thread> #include <chrono> //普通耗时函数 int calcFunc(int a, int b) { qDebug() << "QtConcurrent 普通函数 子线程ID:" << QThread::currentThreadId(); QThread::msleep(1000); return a + b; } void demo_QtConcurrent() { //异步执行函数 QFuture<int> future = QtConcurrent::run(calcFunc, 111, 555); qDebug() << "主线程不阻塞,等待计算..."; future.waitForFinished(); //阻塞等待结果 qDebug() << "QtConcurrent计算结果:" << future.result(); //Lambda版本 QFuture<void> lambdaTask = QtConcurrent::run([](){ qDebug() << "QtConcurrent Lambda 子线程ID" << QThread::currentThreadId(); }); lambdaTask.waitForFinished(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main start"; qDebug() << "主线程ID" << QThread::currentThreadId(); demo_QtConcurrent(); qDebug() << "main end"; return 0; //return a.exec(); }

五、方式5

1.C++原生std::thread(非Qt线程模型):

1)直接使用C++标准库std::thread,可运行lambda/普通函数。

2.测试

main.cpp

#include <QCoreApplication> #include <QThread> #include <QRunnable> #include <QThreadPool> #include <QtConcurrent/QtConcurrent> #include <QDebug> #include <thread> #include <chrono> void stdThreadWork(int val) { qDebug() << "std::thread 子线程值:" << val; //阻塞当前线程2秒 std::this_thread::sleep_for(std::chrono::seconds(2)); } void demo_stdThread() { std::thread t1(stdThreadWork, 666); std::thread t2([](){ qDebug() << "std::thread lambda"; }); t1.join(); //等待线程执行完毕 t2.join(); qDebug() << "std::thread全部结束"; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "main start"; qDebug() << "主线程ID" << QThread::currentThreadId(); demo_stdThread(); qDebug() << "main end"; return 0; //return a.exec(); }

相关新闻

  • 39元V851se开发板视觉应用开发全解析
  • VLANeXt:一份可执行的VLA工程设计手册
  • Windows 11 24H2与LTSC 2024版本解析与部署指南

最新新闻

  • 雷达中国官方售后服务中心|服务热线及网点地址权威信息通知(2026年7月最新) - 亨得利钟表维修中心
  • 从模糊需求到技术实现:Spring Boot武器评分系统开发实践
  • 5步搭建企业级AI绘图平台:基于Docker的ComfyUI完整部署方案
  • CANN/asc-devkit SIMT half2乘法函数
  • 人形机器人续航瓶颈与系统级优化路径
  • JellyBook入门教程:快速连接Jellyfin服务器并开始阅读

日新闻

  • 佛山青少年训练营推荐:军博营地实力顶尖 - 秋山寄远
  • 如何快速上手PvZ2 Gardendless:免费Web版植物大战僵尸2完整指南
  • jiuwen-deepsearch核心功能详解:规划-检索-反思三合一智能工作流

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号