qt 多线程例子 moveToThread
时间: 2023-06-26 07:09:53 浏览: 161
Qt中的多线程可以使用`QThread`类来实现,而`moveToThread`是一个很常用的函数,用于将一个QObject对象移动到另一个线程中执行。
下面是一个使用`moveToThread`的简单例子:
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork()
{
qDebug() << "Worker thread:" << QThread::currentThreadId();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Worker worker;
QThread thread;
worker.moveToThread(&thread);
QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);
QObject::connect(&worker, &Worker::destroyed, &thread, &QThread::quit);
thread.start();
return a.exec();
}
```
在上面的例子中,我们创建了一个`Worker`类,它继承自`QObject`类,并有一个`doWork`槽函数。我们将`worker`对象通过`moveToThread`函数移动到了`thread`线程中。然后,我们通过`connect`函数将`thread`的`started`信号连接到`worker`的`doWork`槽函数上,当线程启动时,`doWork`槽函数会在`thread`线程中执行。同时,我们还将`worker`的`destroyed`信号连接到`thread`的`quit`槽函数上,以保证线程能够正确退出。
需要注意的是,如果我们将一个QObject对象移动到了另一个线程中执行,那么它的所有信号和槽函数都必须在该线程中执行,否则会出现问题。所以,在上面的例子中,我们将`worker`对象的`doWork`槽函数定义为`public slots`,并且在`thread`线程中执行,以保证它能正确执行。
阅读全文