[英]Change affinity of an Object from a QThread to Main GUI Thread
我有一个Qt GUI应用程序,其中包含一些类和一个main。 对于其中一项计算量很大的编写操作,我创建了一个QThread
作为类成员。 像这样:
//class members
std::unique_ptr<QThread> m_savingThread;
std::unique_ptr<DiffClass> m_controller;
connect(this, &SomeClass::saveAll, m_controller.get(), &DiffClass::saveToAll, Qt::QueuedConnection);
connect(m_controller.get(), &DiffClass::done, m_savingThread.get(), &QThread::quit);
void SomeClass::saveToFile()
{
//Saving thread
qDebug() << "From main thread:" << QThread::currentThreadId();
m_controller->moveToThread(m_savingThread.get());
m_savingThread->start();
qRegisterMetaType<std::string>("std::string");
emit saveAll(someString);
}
上面的代码工作正常。 但是一旦保存操作完成,我需要将m_controller
对象返回到主GUI线程。 我在这里可以找到类似的东西 。 简要地说,它声明由于QThread
只能将对象“推”入线程,因此我需要将其从当前工作线程再次推入主线程。
void DiffClass::saveToAll(someString)
{
qDebug() << "From worker thread:" << QThread::currentThreadId();
/*saving operation*/
moveToThread(QApplication::instance()->thread()); //Error QCoreApplication has no member thread()
emit done();
}
有没有一种方法可以将对象的亲和力更改回主线程?
编辑1:我对saveToAll
connect
是一个QueuedConnection。
首先,为什么要来回切换线程亲和力? 似乎没有实际的一面。
除此之外,应该有可能将其更改为另一种威胁,条件是该对象没有父对象,并且从当前关联线程调用moveToThread()
。
您可以将QMetaObject::invokeMethod()
与从任何线程指定的Qt::QueuedConnection
使用,以调度从当前亲和力线程执行的插槽执行,这将从正确的线程更改为您作为参数传递的任何线程的亲和力。
但是,只要您通过信号/插槽机制(而不是直接从任何线程直接saveToAll()
调用saveToAll()
就可以看到如何尝试从类内部进行更改,这应该可以按预期工作。
//Error QCoreApplication has no member thread()
它当然可以根据文档进行操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.