【发布时间】:2018-05-17 13:11:17
【问题描述】:
我有一个 Qt GUI 应用程序,其中包含一些类和一个主程序。对于计算量大的写入操作之一,我创建了一个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 线程。我可以找到类似的东西
here。简而言之,它指出由于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: 我的 connect 到 saveToAll 是一个 QueuedConnection。
【问题讨论】:
-
你肯定有
#include <QApplication>?我问是因为QApplication::instance()返回QCoreApplication *,所以我希望错误消息是QCoreApplication has no member thread()。 -
抱歉打错字了....你是对的。
标签: c++ multithreading qt qthread