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

Qt的moveToThread使用

worker.h

#ifndef WORKER_H
#define WORKER_H
#include <QObject>class Worker : public QObject
{Q_OBJECT
public slots:void doHeavyWork(); // 耗时的任务
signals:void resultReady(const QString &result); // 发出工作结果的信号
};
#endif // WORKER_H

worker.cpp

#include "worker.h"
#include <QThread>
#include <QDebug>void Worker::doHeavyWork()
{qDebug() << "Worker starts working in thread:" << QThread::currentThreadId();long long sum = 0;// 模拟一个耗时的任务for (long long i = 0; i < 999999999999999999; ++i) {sum += 1;}emit resultReady(QString("Finished! Worked"));qDebug() << "Worker finished";
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();
private slots:void on_startButton_clicked();void handleResults(const QString &result);
signals:void operate(); // “开始工作”信号
private:Ui::MainWindow *ui;QThread *m_workerThread;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "worker.h" 
#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << "UI is running in thread:" << QThread::currentThreadId();// 1. 准备“新车间”和“工人”m_workerThread = new QThread(this);Worker *worker = new Worker();// 2. 把工人“调派”到新车间worker->moveToThread(m_workerThread);// 3. 建立信号槽connect(this, &MainWindow::operate, worker, &Worker::doHeavyWork);connect(worker, &Worker::resultReady, this, &MainWindow::handleResults);// 车间关闭后,自动解雇工人(释放内存)connect(m_workerThread, &QThread::finished, worker, &QObject::deleteLater);// 4. 打开车间大门m_workerThread->start();
}
MainWindow::~MainWindow()
{m_workerThread->quit(); // 关闭车间m_workerThread->wait(); // 等工人下班delete ui;
}
void MainWindow::on_startButton_clicked()
{ui->resultLabel->setText(u8"正在玩命计算中... ⏳");// 5. 让工人开工!emit operate();
}
void MainWindow::handleResults(const QString &result)
{ui->resultLabel->setText(result + u8" ✅");
}

moveToThread的流程:
1.分离
QThread管线程,Worker管任务。
2.调派
worker->moveToThread(thread)。
3.连接
用信号槽连接UI和Worker。
4.启动
thread->start(),然后emit信号开工

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

相关文章:

  • SQL-leetcode—3451. 查找无效的 IP 地址
  • centos常用命令
  • Visual Studio Code (VS Code) 工作区配置文件的作用
  • CentOS7安装部署NexusRepository
  • 【Spring Cloud 微服务】2.守护神网关Gateway
  • 告别人工建模:AI 自动化 ETL 工具对比,数据 pipeline 搭建时间缩短 60% 的实践
  • 洛谷 P2656 采蘑菇-普及+/提高
  • k 均值聚类算法总结
  • 从入门到精通:Java设计模式——单例模式
  • 8.21IPSEC安全基础后篇,IKE工作过程
  • 【TWT】
  • 常德二院信创转型实战:全栈国产化提升医疗效率与安全
  • 嵌入式linux设备升级和sm32升级对比
  • 计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
  • el-table-draggable拖拽实现表格内容排序
  • VUE从入门到精通二:ref、reactive、computed计算属性、watch监听、组件之间的通信
  • 网络与信息安全有哪些岗位:(5)安全开发工程师
  • Android14内核调试 - boot vendor_boot
  • Git常用操作大全(附git操作命令)
  • Matplotlib数据可视化实战:Matplotlib数据可视化入门与实践
  • golang实现的Rsa加密解密算法(go和java交互时双向加解密方案)
  • OpenCV 形态学操作详解:腐蚀、膨胀与开闭运算
  • Chrome/360 浏览器 WebUI 资源底层机制解析:共享资源与专属资源的奥秘
  • 一、部署LNMP
  • mac的m3芯片安装JDK8、JDK17
  • 【CDA干货】金融App产品AB测试与指标体系搭建
  • 数据结构之排序大全(3)
  • 31、工业网络异常行为检测与OT协议深度分析 (核电站DCS模拟) - /安全与维护组件/network-anomaly-detection-nuclear
  • “码” 上安全:轻量级加密的硬件实现与侧信道攻击防御
  • Java实现一个简单的LRU缓存对象