Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QT线程问题_Qt_Qt4 - Fatal编程技术网

QT线程问题

QT线程问题,qt,qt4,Qt,Qt4,我正在使用以下代码。。但我得到的错误是 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

我正在使用以下代码。。但我得到的错误是

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
RenderRead::RenderRead(CGNetwork*CGNetwork)
{
城市URL=”http://112.138.3.181/City/Cities";
类别URL=”http://112.138.3.181/City/Categories";
cgnetworks=cgnetworks;
start();
}
void RenderThread::run()
{
qDebug()获取城市列表(cityUrl);
}
请帮帮我。提前感谢。

根据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."); if(父项和父项->d_func()->threadData!=d->threadData){ qWarning(“QObject:无法为位于不同线程中的父线程创建子线程。”); 您可以看到,无论d_func是什么,它都包含一个指向threadData的指针。此语句的意思是,如果此对象的父对象存在,并且父对象的threadData与此对象(子对象)的线程数据不==(可能通过指针进行比较),则您将收到此警告

因此,根据Qt源代码,看起来您正试图在新的thread对象中创建一个对象,并使其父对象成为thread对象以外的其他对象

简单的解决办法是:不要这样做,找另一种方法

更高级的解决方案是:在父级中创建一个插槽,并将其连接到子级中的一个信号。该插槽实际上创建了子级,当您需要创建该信号时,就会触发该信号


顺便说一句,这不是我第一次通过浏览源代码在Qt中找到一些东西。通常情况下,你可以找到你感兴趣的类的源代码,并通过查看这些源代码来了解情况。

每个QObject都属于一个QThread。你试图在不同的线程中创建一个QObject,而不是创建它时使用的线程


用于将
cgnetwork
移动到您的
RenderThread

嗨..我正在使用以下方法。是否正确?void RenderThread::run(){cgnetwork oCgNetwork;qDebug()如果您在
run
方法中创建
CGNetwork
对象,它已经属于所需的QThread-
RenderThread
。谢谢。我发布了我的问题作为另一个问题()。您能解决我的问题吗?谢谢是advance…@Girij当然可以。我会保留答案,以防以后对其他人有所帮助。 if (parent && parent->d_func()->threadData != d->threadData) { qWarning("QObject: Cannot create children for a parent that is in a different thread.");