在使用QNetworkAccessManager類時,用到線程了,
運行后提示:
QObject: Cannot create children for a parent that is in a different thread.
Parent is QNetworkAccessManager(0x7bfe60), parent's thread is QThread(0x8b73)
搜索了一下 ,發現有這篇文章,參照 即可解決
有可能大家在利用qt寫程序的時候遇到這類提醒,這事實上是再說父類和子類的線程不對。
下面是我沒解決錯誤前的代碼
thread_http = new QThread;
thread_query = new QThread;
httpA = new HttpGP;
seriportQuery = new SeriportQuery;
httpA->moveToThread(thread_http);
// httpA->accessManager->moveToThread(thread_http);
seriportQuery->moveToThread(thread_query);
thread_http->start();
thread_query->start();
我線性的認為把一個類放到線程里那么相關的內部一切都放到子線程中了,結果就是那么尷尬出現了上面的錯誤。
這里指出,QNetworkAccessManager 也是一個獨立的類並不從屬HttpGP 這個類,所以它實際在工作在主線程,而執行完上述代碼后HttpGP執行在子線程中,線程不匹配導致了錯誤的出現。
解決的辦法就是讓QNetworkAccessManager也移到HttpGP所在的線程,
httpA->accessManager->moveToThread(thread_query);//就是解決方法
例外就是在聲明后面加入(this)
accessManager = new QNetworkAccessManager(this);
如果你在run()中實現的,那就是在run內實例化