概述
本文主要介绍了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