概述

本文主要介绍了QThread和QObject::moveToThread()的使用。首先,我们将概述QThread和QObject::moveToThread()的概念。然后,我们将通过一个使用例子来演示如何使用QObject::moveToThread()。最后,我们将详细介绍worker.h、worker.cpp文件中的代码。

一. QThread和QObject::moveToThread()的概念

1. QThread:QThread类是一个用于处理多线程的类,它提供了一些基本的功能,如启动线程、停止线程等。

2. QObject::moveToThread():这是一个静态函数,用于将一个QObject对象移动到另一个QThread对象中。这样,当QObject对象在新的线程中运行时,它可以与主线程进行通信。

二. QObject::moveToThread()的使用例子

下面将参照文档,举一个例子来说明线程的使用并验证上述说法(可直接先看下面结果,再看过程):

```cpp

#include

class Worker : public QObject {

Q_OBJECT

public:

explicit Worker(QObject *parent = nullptr);

Worker(QString name, QObject *parent = nullptr);

signals:

void resultReady(const QString &resultReady); //工作完成信号

public slots:

void doWork(const QString ¶meter); //工作函数

private:

QString name;

};

```

在worker.cpp中实现doWork槽函数:

```cpp

#include "worker.h"

#include

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

Worker::Worker(QString name, QObject *parent) : QObject(parent), name(name) {}

void Worker::doWork(const QString ¶meter) {

qDebug() << "开始工作:" << name << parameter;

// 这里执行一些耗时操作

qDebug() << "工作完成:" << name << parameter;

}

```

```cpp

#include "worker.h"

#include

#include

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

Worker::Worker(QString name, QObject *parent)

{

this->name = name;

}

void Worker::doWork(const QString ¶meter)

{

qDebug() << "当前Worker线程ID:" << QThread::currentThreadId() << endl;

qDebug() << name << "正在" << parameter << endl;

emit resultReady(name + parameter + "完成");

}

```

```cpp

#include "boss.h"

#include

Boss::Boss(QObject *parent) : QObject(parent) {

worker = new Worker("A");

worker->moveToThread(&workThread);

connect(&workThread, &QThread::finished, worker, &QObject::deleteLater);

connect(this, &Boss::order, worker, &Worker::doWork); //用信号和槽的方式调用doWork()函数

connect(worker, &Worker::resultReady, this, &Boss::handleResult);

workThread.start();

}

Boss::~Boss() {

workThread.quit();

workThread.wait();

}

void Boss::handleResult(const QString result) {

qDebug() << "Boss got it :" << result << endl;

}

void Boss::order2(const QString order) {

qDebug() << "order2:";

worker->doWork(order); //直接调用

}

```

以下是重构后的代码:

```cpp

#include

#include

#include

int main(int argc, char *argv[]) {

QCoreApplication a(argc, argv);

qDebug() << "当前Boss线程ID:" << QThread::currentThreadId() << endl;

Boss boss;

QObject::connect(&boss, &Boss::order, [](){ qDebug() << "order2doWork"; });

QObject::connect(&boss, &Boss::order2, [](){ qDebug() << "orderdoWork"; });

boss.moveToThread(QThread::currentThread());

boss.order("整理资料(order)"); // 用信号触发槽函数的方式

boss.order2("整理资料(order2)"); // 直接调用函数的方式

return a.exec();

}

```

从上面可以看出:

- order2doWork orderdoWork

- moveToThread