Qt 中 moveToThread

本文介绍了如何利用QObject的moveToThread方法和QThread进行多线程编程。通过创建一个继承自QObject的工作对象,并将其移动到新的线程中,可以在不同线程中执行任务。当信号被触发时,工作对象开始执行doWork()函数,完成后发出workFinished信号,线程接收到信号后退出并销毁相关对象。这种方法允许在多个槽函数中定义任务,提高了代码的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

使用 QObject::moveToThread() 方法,可以把一个继承自 QObject 的对象交给一个 QThread 对象,然后再调用 QThread 的 start() 函数使其全权处理事件循环,当我们需要让子线程执行某个任务,只需要发出对应的信号就可以。
而继承 QThread 实现多线程方法,只能执行 run() 函数中的任务。使用 moveToThread 可以定义多个槽函数,用相应的信号触发即可。

代码示例

①.定义一个继承自 QObject 的对象

class WorkObject : public QObject
{
  Q_OBJECT
public:
  WorkObject(QObject *parent = nullptr);
  ~WorkObject();
signals:
  void workStart();//工作开始
  void workFinished();//工作完成
private:
  void doWork();
public slots:
  void starWork();//开始工作
};


WorkObject::WorkObject(QObject *parent)
  : QObject(parent)
{
}

WorkObject::~WorkObject()
{
  qDebug() << "WorkObject 销毁" << endl;
}

void WorkObject::doWork()
{
  for (int i = 0; i < 1000; ++i)
  {
    qDebug() << i << endl;
  }
  emit workFinished();
}

void WorkObject::starWork()
{
  emit workStart();
  doWork();
}

②.使用 moveToThread 转移线程

WorkObject * workObject = new WorkObject();//工作对象
QThread * workThread = new QThread();//工作线程
//转移线程
workObject->moveToThread(workThread);
//开始工作
QObject::connect(workThread, &QThread::started, workObject, &WorkObject::starWork);
//工作对象工作结束,停止线程
QObject::connect(workObject, &WorkObject::workFinished, workThread, [&]() {
   workThread->quit();
    workThread->wait();
});
//工作线程停止,销毁工作对象
QObject::connect(workThread, &QThread::finished, workObject, &WorkObject::deleteLater);
//工作对象销毁,销毁工作线程
QObject::connect(workObject, &WorkObject::destroyed, workThread, &QThread::deleteLater);
//线程销毁
QObject::connect(workThread, &QThread::destroyed, [&]() {
    qDebug() << "workThread 销毁" << endl;
 });
//启动线程
 workThread->start();

代码运行结果如下:
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值