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