繁体   English   中英

将对象的亲和力从QThread更改为GUI主线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM