从线程中分离对象

Detach object from thread

本文关键字:对象 分离 线程      更新时间:2023-10-16

一个简单的问题:是否可以将QObject从QThread分离,以便将其移动到主线程?

我使用以下代码:

QThread *thread = new QThread();
MyObject *object = new MyObject();
object->moveToThread(thread);
thread->start();

然后我想把MyObject实例移到主线程中。

object->moveToThread(QApplication::instance()->thread());

我有以下错误:QObject::moveToThread: Current thread (0x00000001) is not the object's thread (0x00000002). Cannot move to target thread (0x00000003)

感谢

正如官方文档所说,moveToThread函数不能从另一个线程"拉"一个对象,而是将一个对象"推"到另一个螺纹。

这就是为什么如果您想更改对象的线程相关性,则应该在当前对象的线程中进行更改。

我添加了一个简单的例子。

这是Worker类:

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = 0);
signals:
    void done();
public slots:
    void doWork();
    void checkThread();
private:
    bool isMainThread();
};
Worker::Worker(QObject *parent) :
    QObject(parent)
{
    qDebug() << __PRETTY_FUNCTION__ 
             << QThread::currentThread() 
             << isMainThread();
}
void Worker::doWork()
{
    qDebug() << __PRETTY_FUNCTION__ 
             << QThread::currentThread() 
             << isMainThread();
    qDebug() << __PRETTY_FUNCTION__ << "Work is done";
    moveToThread(qApp->thread());
    emit done();
}
void Worker::checkThread()
{
    qDebug() << __PRETTY_FUNCTION__ 
             << QThread::currentThread() 
             << isMainThread();
}
bool Worker::isMainThread()
{
    return QThread::currentThread() == qApp->thread();
}

我们创建了一个Worker对象和一个QThread对象,并将它们相互连接:

QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), worker, SLOT(doWork()));
QObject::connect(worker, SIGNAL(done()), thread, SLOT(quit()));
QObject::connect(thread, SIGNAL(finished()), worker, SLOT(checkThread()));
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();

这就是我们在应用程序输出中得到的:

Worker::Worker(QObject*) QThread(0x1034680) true 
void Worker::doWork() QThread(0x1224970) false 
void Worker::doWork() Work is done 
void Worker::checkThread() QThread(0x1034680) true 

在主应用程序线程中创建一个Worker对象,然后它在一个新线程中完成工作。作业完成后,它发送done()信号,并将自己移回主线程。线程完成后,我们再次检查Worker对象是否真的在主线程中。

但我真的不明白你为什么需要这个。