当前位置: 首页 > news >正文

Qt创建线程的方法

Qt创建线程的方法


方法1:继承 QThread 并重写 run()(经典方法)

#include <QThread>
#include <QDebug>class WorkerThread : public QThread {Q_OBJECT
protected:void run() override {qDebug() << "子线程ID:" << QThread::currentThreadId();// 在这里执行耗时任务for (int i = 0; i < 5; ++i) {msleep(500); // 模拟耗时操作qDebug() << "工作进度:" << i;}}
};// 使用线程
WorkerThread *thread = new WorkerThread();
connect(thread, &WorkerThread::finished, thread, &QObject::deleteLater); // 自动清理
thread->start(); // 启动线程

方法2:moveToThread + 信号槽(推荐方法,符合Qt事件模型)

#include <QObject>
#include <QThread>
#include <QDebug>class Worker : public QObject {Q_OBJECT
public slots:void doWork() {qDebug() << "子线程ID:" << QThread::currentThreadId();for (int i = 0; i < 5; ++i) {QThread::msleep(500);qDebug() << "工作进度:" << i;}emit workFinished();}
signals:void workFinished();
};// 使用线程
QThread *thread = new QThread();
Worker *worker = new Worker();worker->moveToThread(thread); // 关键:将对象移到新线程connect(thread, &QThread::started, worker, &Worker::doWork); // 线程启动触发工作
connect(worker, &Worker::workFinished, thread, &QThread::quit); // 结束线程
connect(thread, &QThread::finished, thread, &QObject::deleteLater); // 清理线程
connect(thread, &QThread::finished, worker, &QObject::deleteLater); // 清理Workerthread->start(); // 启动线程事件循环

方法3:使用 QtConcurrent(简化并行任务)

#include <QtConcurrent>
#include <QDebug>void simpleTask() {qDebug() << "子线程ID:" << QThread::currentThreadId();for (int i = 0; i < 5; ++i) {QThread::msleep(500);qDebug() << "任务进度:" << i;}
}// 启动线程
QFuture<void> future = QtConcurrent::run(simpleTask);

方法4:使用 QRunnable + QThreadPool(任务池)

#include <QRunnable>
#include <QThreadPool>
#include <QDebug>class Task : public QRunnable {
public:void run() override {qDebug() << "子线程ID:" << QThread::currentThreadId();for (int i = 0; i < 5; ++i) {QThread::msleep(500);qDebug() << "任务进度:" << i;}}
};// 提交任务到全局线程池
Task *task = new Task();
task->setAutoDelete(true); // 自动删除任务对象
QThreadPool::globalInstance()->start(task);

关键区别总结:

方法适用场景线程管理通信方式
继承QThread简单独立任务手动管理线程需自定义信号槽
moveToThread复杂对象(需事件循环/信号槽)自动事件循环内置信号槽
QtConcurrent单次函数调用(无状态任务)自动线程池管理通过QFuture
QRunnable高并发短任务(线程池复用)线程池管理需手动实现

注意事项:

  1. 线程安全:跨线程访问数据时使用互斥锁(QMutex)或信号槽。
  2. 事件循环moveToThread 依赖线程的事件循环(通过 exec() 启动)。
  3. 资源释放:使用 QObject::deleteLater 安全释放对象。
  4. 全局线程池QtConcurrentQRunnable 默认使用 QThreadPool::globalInstance()

对于需要事件循环的复杂任务,moveToThread 是最推荐的方式

http://www.dtcms.com/a/266396.html

相关文章:

  • Winscope在aosp 13/14/15版本的使用总结
  • AI Agent在企业管理中的落地路径:从概念到实践的转型指南
  • 面试版-前端开发核心知识
  • HTML表格导出为Excel文件的实现方案
  • Excel 实现进制转换 Excel十进制转二进制 Excel 中文转unicode Excel实现Unicode转中文
  • 本地部署Dify并结合ollama大语言模型工具搭建自己的AI知识库
  • 面向开发者的API平台设计与选型建议【附源码示例】
  • flutter封装vlcplayer的控制器
  • 如何使用DeepSeek一键生成系统架构图?
  • 如何将大型视频文件从 iPhone 传输到 PC
  • 怎么更改cursor字体大小
  • 10分钟搭建 PHP 开发环境教程
  • VSCode 安装使用教程
  • SQL Server 进阶语法实战:从动态透视到存储过程的深度应用(第四课)
  • 高功率的照明LN2系列助力电子元件薄膜片检测
  • 推荐算法系统系列>推荐数据仓库集市的ETL数据处理
  • GaussDB权限管理:从RBAC到精细化控制的企业级安全实践
  • 设计模式(十)
  • [学习记录]Unity毛发渲染[URP]-Fin基础版
  • Django Channels WebSocket实时通信实战:从聊天功能到消息推送
  • Linux入门篇学习——Linux 帮助手册
  • 八、测试与调试
  • 万勋科技「柔韧机器人玻璃幕墙清洗」全国巡展@上海!引领清洗无人机智能化升级
  • Rovo Dev CLI Windows 安装与使用指南
  • 暑期数据结构第一天
  • CLIP的tokenizer详解
  • 2-jdk8环境下安装Kafka
  • 标签体系设计与管理:从理论基础到智能化实践的综合指南
  • chrome安装AXURE插件后无效
  • uniapp 微信小程序水印