Qt moveToThread仅在第一次工作

问题描述 投票:0回答:1

我正在创建一个执行无限任务的应用程序,因此我决定使用QThread来管理它。在特定条件下,此线程应生成临时的therad以执行某些计算。问题是这只是第一次工作,而第二次我得到这个错误:

QObject::moveToThread: Current thread (0xd29078) is not the object's thread (0x6e000df0).
Cannot move to target thread (0x6e002c68)

在主要内容中,我初始化了类并将其移动到QThread中。

AccelerometerBuffer accBuffer;
QThread *accelerometerThread = new QThread;
accelerometerThread->setObjectName("AccelerometerThread");
accelerometerThread->setParent(&accBuffer);
accBuffer.moveToThread(accelerometerThread);
QObject::connect(accelerometerThread,SIGNAL(started()),&accBuffer,SLOT(readAccelerationData()));
QObject::connect(accelerometerThread,SIGNAL(finished()),accelerometerThread,SLOT(deleteLater()));
accelerometerThread->start();

在readAccelerationData中,在条件之后,我应该在AccelerometerBuffer类中调用另一个SLOT(saveData()),因此临时线程应该由accelerometerThread生成。

if(condition){
    QThread* thread = new QThread;
    QThread::currentThread()->moveToThread(thread);
    connect(thread,SIGNAL(started()),QThread::currentThread()->parent(),SLOT(saveData()));
    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
    thread->start();
}

第一次出现这种情况时,一切正常,saveData正确执行。以下时间,相反,我得到错误,我不明白原因。

c++ qt qthread
1个回答
0
投票

你只能从拥有线程moveToThread。一旦您转移到另一个线程,同一个呼叫将无法再执行任何操作。

来自https://doc.qt.io/qt-5/qobject.html#moveToThread

警告:此功能不是线程安全的;当前线程必须与当前线程关联相同。换句话说,这个函数只能将一个对象从当前线程“推”到另一个线程,它不能将一个对象从任意线程“拉”到当前线程。

© www.soinside.com 2019 - 2024. All rights reserved.