Qt moveToThread 仅在第一次工作

Posted

技术标签:

【中文标题】Qt moveToThread 仅在第一次工作【英文标题】:Qt moveToThread works only the first time 【发布时间】:2019-03-05 21:57:48 【问题描述】:

我正在创建一个执行无限任务的应用程序,因此我决定使用 QThread 来管理它。在特定条件下,该线程应该产生一个临时的 therad 以便执行一些计算。问题是这仅在第一次有效,而第二次出现此错误:

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

在 main 中,我初始化了类并将其移动到 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】:

您只能在拥有线程中moveToThread。一旦你移动到另一个线程,同一个调用将不再能够做任何事情。

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

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

【讨论】:

那么,accelerometerThread 第二次“存在”在临时线程的上下文中并且不能执行另一个moveToThread,对吧? 不太清楚你的意思@Cristiano 将 accelerometerThread 移动到临时线程后,如您所说,当前线程必须与当前线程关联性相同,但我更改了它,所以我得到了错误。这是我的主要疑问

以上是关于Qt moveToThread 仅在第一次工作的主要内容,如果未能解决你的问题,请参考以下文章

Qt源码阅读 moveToThread

qt5 通过moveToThread方式创建的线程,主线程(GUI)是不是会控制工作线程

Qt moveToThread:对象带来了哪些资源?

Qt 多线程使用moveToThread

在 moveToThread() 之后未调用 Qt 4.8 信号/插槽

未调用 Qt moveToThread 插槽