簡體   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