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 仅在第一次工作的主要内容,如果未能解决你的问题,请参考以下文章
qt5 通过moveToThread方式创建的线程,主线程(GUI)是不是会控制工作线程