2010-09-30 105 views
0

我使用下面的代碼。但我得到了像QT Thread_問題

THREAD Started 
QObject: Cannot create children for a parent that is in a different thread. 
(Parent is CGNetwork(0x10151d0d0), parent's thread is QThread(0x1016015b0), current thread is RenderThread(0x10155de40) 

代碼中的錯誤:

RenderThread.cpp 
RenderThread::RenderThread(CGNetwork *cgnetwork) 
{ 
    cityUrl = "http://112.138.3.181/City/Cities"; 
    categoryUrl = "http://112.138.3.181/City/Categories"; 
    cgnetworks = cgnetwork; 
    start(); 
} 
void RenderThread::run() 
{ 
    qDebug()<< "THREAD Started"; 
    cgnetworks->getCityList(cityUrl); 
} 

請幫助我。提前致謝。

回答

2

每個QObject都屬於一個QThread。你試圖在與創建它不同的線程中創建一個QObject。

使用QObject::moveToThreadcgnetwork移動到您的RenderThread

+0

嗨..我使用以下方法。它是否正確? void RenderThread :: run() CGNetwork oCgNetwork; qDebug()<<「THREAD Started」<< cityUrl; oCgNetwork.getCityList(cityUrl); } 請幫助我。 – Finder 2010-09-30 14:24:22

+0

如果您在'run'方法中創建'CGNetwork'對象,它已經屬於所需的QThread - 'RenderThread'。 – 2010-09-30 17:02:50

+0

謝謝。我發佈我的問題是作爲另一個問題(http://stackoverflow.com/questions/3836474/qt-thread-call-issues)。你能解決我的問題嗎?謝謝你提前... – Finder 2010-10-01 04:13:25

0

從Qt的源代碼(大約2006年),爲QObject的構造函數(QObject的*)包含以下內容:

 
if (parent && parent->d_func()->threadData != d->threadData) { 
     qWarning("QObject: Cannot create children for a parent that is in a different thread."); 

你可以看到,它包含一個指向一種叫threadData任何d_func。這個語句的意思是,如果這個對象的父對象存在,並且父對象的threadData不是==(可能通過指針比較)到這個對象的(子對象)線程數據,那麼你會得到這個警告。

因此,基於Qt源代碼,它看起來像你試圖在新的線程對象中創建一個對象,並使其父對象不是線程對象。

簡單的解決方案:不要這樣做。找到另一種方式。

更高級的解決方案:在父級創建一個插槽並將其連接到子級的信號。插槽實際上創建了孩子,信號在您想要創建時觸發。

http://www.koders.com/cpp/fid824DA2E851F8AF2534234010E4E72BA361F9648A.aspx?s=mdef%3Asocket

順便說一句,這不是我第一次通過瀏覽源代碼中發現Qt中的東西。通常情況下,您可以找到您感興趣的課程的來源,並通過查看該課程來了解具體情況。

+0

謝謝你san jacinto – Finder 2010-10-01 03:36:46

+0

@Girij當然可以。如果以後可以幫助別人,我會留下答案。 – 2010-10-01 10:38:29