在不同的线程中创建了一个 QObject 的子对象。在 Qt 中,每个 QObject 对象都必须与一个线程相关联,以确保线程安全。请写个例子说明
时间: 2024-03-09 22:45:25 浏览: 47
好的,这里是一个简单的例子:
```cpp
#include <QCoreApplication>
#include <QObject>
#include <QThread>
#include <QDebug>
class MyObject : public QObject
{
public:
MyObject(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork()
{
qDebug() << "MyObject::doWork() thread: " << QThread::currentThread();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Main thread: " << QThread::currentThread();
// 创建一个QObject对象,并将它移动到另一个线程
QThread thread;
MyObject *myObject = new MyObject();
myObject->moveToThread(&thread);
// 连接信号槽
QObject::connect(&thread, &QThread::started, myObject, &MyObject::doWork);
// 启动线程
thread.start();
return a.exec();
}
```
在这个例子中,我们创建了一个 MyObject 对象,并将它移动到另一个线程中。然后我们连接了线程的 started 信号与 MyObject 的 doWork 槽,这样当线程启动时,就会调用 MyObject 的 doWork 函数。在 MyObject 的 doWork 函数中,我们输出当前线程的信息。最后,在主线程中调用 QApplication 的 exec 函数,进入事件循环,等待程序退出。当程序运行时,我们会看到如下输出:
```
Main thread: QThread(0x7fff8e8d4c50)
MyObject::doWork() thread: QThread(0x7fff8e8d4d20)
```
可以看到,主线程和 MyObject 的 doWork 函数运行在不同的线程中。这就是通过将 MyObject 移动到另一个线程中来实现的。注意,在这个例子中,我们只是将 MyObject 移动到了另一个线程中,而没有将主线程和 MyObject 连接起来,因此 MyObject 的成员函数只会在它所属的线程中运行。
阅读全文