请写一个moveToThread的例程
时间: 2024-05-11 10:17:56 浏览: 120
以下是一个简单的 `moveToThread` 的示例代码:
```cpp
// MyObject.h
#pragma once
#include <QObject>
#include <QThread>
class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = nullptr);
public slots:
void doWork();
private:
QThread workerThread;
};
// MyObject.cpp
#include "MyObject.h"
MyObject::MyObject(QObject *parent) : QObject(parent)
{
// 把 MyObject 实例移动到工作线程
this->moveToThread(&workerThread);
// 连接线程启动信号,槽函数为 doWork()
connect(&workerThread, &QThread::started, this, &MyObject::doWork);
// 连接线程结束信号,槽函数为线程的 quit() 槽函数
connect(&workerThread, &QThread::finished, &workerThread, &QThread::quit);
// 设置线程的运行优先级
workerThread.setPriority(QThread::HighPriority);
}
void MyObject::doWork()
{
// 执行耗时的操作
// 发射自定义信号,通知主线程工作已完成
emit workFinished();
}
```
在主线程中,我们可以这样创建 `MyObject` 对象:
```cpp
#include <QCoreApplication>
#include "MyObject.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyObject myObject;
// 连接自定义信号 workFinished,槽函数为主线程中的 quit() 槽函数
QObject::connect(&myObject, &MyObject::workFinished, &a, &QCoreApplication::quit);
// 启动工作线程
myObject.start();
// 进入主线程的事件循环
return a.exec();
}
```
在这个例子中,我们创建了一个 `MyObject` 对象,并将其移动到了一个新的线程中。然后,我们连接了 `MyObject` 对象的 `workFinished` 信号到主线程的 `quit()` 槽函数,以便在工作线程完成工作后退出应用程序的事件循环。
在 `MyObject` 对象的 `doWork()` 函数中,我们可以执行任何耗时的操作,而不会阻塞主线程。完成操作后,我们发射 `workFinished` 信号,通知主线程工作已经完成。