当前位置: 首页 > 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.lryc.cn/news/580273.html

相关文章:

  • 学习开发之hashmap
  • RabbitMQ 高级特性之死信队列
  • 【python深度学习】Day 59 经典时序预测模型3——SARIMA
  • Day05: Python 中的并发和并行(1)
  • SpringAIAlibaba正式版发布!
  • Python-GUI-wxPython-布局
  • 汽车功能安全概念阶段开发【相关项定义HARA】2
  • VS CodeC51 单片机开发环境搭建
  • 【AI大模型面试八股文】大模型训练中如何应对灾难性遗忘问题?
  • Cookie + Session
  • suricata新增协议处理流程
  • 数据结构与算法:贪心(三)
  • 图灵完备之路(数电学习三分钟)----数据选择器与总线
  • 《设计模式之禅》笔记摘录 - 3.工厂方法模式
  • c语言中的函数IV
  • 利用TCP协议,创建一个多人聊天室
  • 关于python
  • NumPy-核心函数np.dot()深入理解
  • 物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
  • 免费PDF处理软件,支持多种操作
  • 转Go学习笔记
  • 项目中大表治理方案实践
  • Dash 安装使用教程
  • 遗传算法的原理与实现示例
  • Kotlin 安装使用教程
  • windows11下启动 rqt 时报错:This application failed to start...... 的解决方法
  • CSS——圆形头像外嵌光圈
  • JavaWeb笔记05
  • 【ACP】阿里云云计算高级运维工程师--ACP
  • 力扣:70. 爬楼梯