2010-07-16 53 views
39

我在Windows 7旗艦版下使用Qt Creator 1.3.0和Qt 4.6.0(32位)。考慮下面的QThread:QObject:無法爲不同線程的父項創建子項

​​

實施

ResultThread::ResultThread() : _net_acc_mgr(this) 
{ 
    connect(&_net_acc_mgr, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(onReplyFinished(QNetworkReply*))); 
} 

void ResultThread::onReplyFinished(QNetworkReply* net_reply) 
{ 
    emit onFinished(net_reply); 
} 

void ResultThread::setPostData(const QString& post_data) 
{ 
    _post_data = post_data; 
} 

void ResultThread::run() 
{ 
    _net_acc_mgr.post(QNetworkRequest(QUrl("http://[omitted]")), 
         QByteArray(_post_data.toStdString().c_str())); 
} 

每當_net_acc_mgr.post()ResultThread::run()執行時,我得到了Qt Creator中的下列應用程序輸出:

QObject:無法爲處於不同線程中的父項創建子項。

(Parent是QNetworkAccessManager(0x22fe58),父母的線程的QThread(0x9284190),當前線程是ResultThread(0x22fe48)

這是什麼意思?怎麼解決呢?在此先感謝。

回答

47

的run()成員函數在不同的線程中執行,而不是其中QNetworkRequestManager對象被創建的線程。

這種不同線程的問題發生的時間與Qt當您使用多個線程。解決此問題的標準方法是使用信號插槽

QNetworkRequestManager屬於在ResultThread創建信號和連接的地方都對象創建插槽ResultThread的構造將是一個好地方。

這是目前在ResultThread ::運行該代碼()轉到新,並且由emit(yourSignal())取代。如有必要,發送一個指向你的ResultThread作爲你的emit函數的參數來獲得對成員函數/變量的訪問。

+0

這工作,但看起來很奇怪。我在'ResultThread'中聲明瞭_net_acc_mgr,但是'ResultThread :: run()'在另一個線程中執行!爲什麼Qt是以這種方式設計的?特別是,爲什麼'ResultThread :: run()'在另一個線程而不是'ResultThread'中運行? – Donotalo 2010-07-17 05:21:06

+14

歡迎來到多線程世界。實際上,創建ResultThread的線程總是與執行ResultThread :: run()的線程不同。想一想,它沒有任何其他意義。 QThread的全部目的是在不同的線程中運行某些東西。爲此,需要爲新線程設置數據,這發生在您創建ResultThread的線程中。完成後,您可以運行線程 - 當然,它可以在不同的線程中運行... – hirschhornsalz 2010-07-17 08:33:53

+1

然後,如果所有代碼都移動到了插槽中,則該插槽將在父線程中執行。爲什麼我們要創建子線程? – diverger 2016-07-18 03:38:14

相關問題