QT Thread_ Issues - PullRequest
       3

QT Thread_ Issues

0 голосов
/ 30 сентября 2010

Я использую следующий код .. Но я получил ошибку вроде

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 ]

2 голосов
/ 30 сентября 2010

Каждый QObject принадлежит QThread.Вы пытаетесь создать объект QObject в другом потоке, чем тот, с которым он был создан.

Используйте QObject :: moveToThread для перемещения cgnetwork на RenderThread.

0 голосов
/ 30 сентября 2010

Из исходного кода 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.");

Вы можете видеть, что чем бы ни был d_func, он содержит указатель на что-то, называемое threadData. Это утверждение означает, что если родитель этого объекта существует, а родитель threadData не == (вероятно, сравнивается по указателю) с данными потока этого объекта (дочернего объекта), то вы получите это предупреждение.

Итак, исходя из исходного кода Qt, похоже, что вы пытаетесь создать объект в новом объекте потока и сделать его родительским объектом какой-то другой объект, чем объект потока.

Простое решение: не делай этого. найти другой путь.

Более продвинутое решение: создайте слот в родительском элементе и подключите его к сигналу в дочернем элементе. Слот фактически создает дочерний элемент, сигнал запускается, когда вы хотите его создать.

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

Кстати, это не первый случай, когда я что-то нашел в Qt, просматривая исходный код. Часто вы можете найти источник интересующего вас класса и посмотреть, что случилось, посмотрев туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...