我在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)
這是什麼意思?怎麼解決呢?在此先感謝。
這工作,但看起來很奇怪。我在'ResultThread'中聲明瞭_net_acc_mgr,但是'ResultThread :: run()'在另一個線程中執行!爲什麼Qt是以這種方式設計的?特別是,爲什麼'ResultThread :: run()'在另一個線程而不是'ResultThread'中運行? – Donotalo 2010-07-17 05:21:06
歡迎來到多線程世界。實際上,創建ResultThread的線程總是與執行ResultThread :: run()的線程不同。想一想,它沒有任何其他意義。 QThread的全部目的是在不同的線程中運行某些東西。爲此,需要爲新線程設置數據,這發生在您創建ResultThread的線程中。完成後,您可以運行線程 - 當然,它可以在不同的線程中運行... – hirschhornsalz 2010-07-17 08:33:53
然後,如果所有代碼都移動到了插槽中,則該插槽將在父線程中執行。爲什麼我們要創建子線程? – diverger 2016-07-18 03:38:14