Qt moveToThread仅在第一次使用时

时间:2019-03-05 21:57:49

标签: c++ qt qthread

我正在创建一个执行无限任务的应用程序,因此我决定使用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被正确执行。 相反,在以下情况下,我得到了错误并且我不理解原因。

1 个答案:

答案 0 :(得分:0)

您只能在所属线程中moveToThread。一旦您移至另一个线程,相同的调用将不再能够执行任何操作。

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

  

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