[QT]多线程的问题 Cannot create children for a parent that is in a different thread

soloopin 2013-02-15 04:33:19
写了一个简单的QT多线程程序,就出现了下面这个问题。
查了一些资料,也不知道该怎么解决。希望大牛们看看。


#ifndef MNG_H
#define MNG_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <iostream>
#include <QThread>

using namespace std;

class Mng : public QThread
{
Q_OBJECT
public:
Mng();
~Mng();
virtual void run();
signals:

public slots:
void replyFinished(QNetworkReply*);

private:
QNetworkAccessManager *manager ;
QNetworkReply *reply;
QNetworkRequest *request ;
};

#endif // MNG_H




#include "mng.h"

Mng::Mng()
{
}
Mng::~Mng()
{
delete manager ;
delete reply;
delete request ;
}

void Mng::run()
{
manager = new QNetworkAccessManager(this);
request = new QNetworkRequest();
request->setUrl(QUrl("http://www.oschina.net"));
reply = manager->get(*request);
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
}

void Mng::replyFinished(QNetworkReply * reply)
{
QString html = reply->readAll();
cout<<html.toStdString()<<endl;
}




#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

#include "mng.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

Mng mng ;
mng.start();
return a.exec();
}




程序输出:


这种问题该怎么改才好?
...全文
2679 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
王腾 2014-03-30
  • 打赏
  • 举报
回复
楼主是怎么解决的啊?为什么我的问题还没有解决呢?
mzcs5431 2013-08-11
  • 打赏
  • 举报
回复
请问楼主这样改线程执行之后怎么关闭线程?我用楼上的方法试了线程启动了,可是关闭的时候就报错。
soloopin 2013-02-15
  • 打赏
  • 举报
回复
谢谢, 问题解决了。
乔巴好萌 2013-02-15
  • 打赏
  • 举报
回复
void Mng::run() { manager = new QNetworkAccessManager(); //这改了 request = new QNetworkRequest(); connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*))); reply = manager->get(QNetworkRequest(QUrl("http://qt.nokia.com"))); this->exec(); //这加一句 }
乔巴好萌 2013-02-15
  • 打赏
  • 举报
回复
引用 5 楼 soloopin 的回复:
引用 4 楼 openXMPP 的回复:void Mng::run() 你不应该在这个线程里做new 和 connect的操作 要在外面的主线程 new完object后connect C/C++ code?1234567891011121314151617181920Mng::Mng(){ manager = new QNetworkAccessMan……
我开始没说清楚 原来的第15行 这样改下 manager = new QNetworkAccessManager(this); 改为 manager = new QNetworkAccessManager(); 因为你Mng是属于主线程的,尽量不要在非主线程里创建新的对象并指定其对象为主线程内的对象,否则QApplication.exec会warning. 你connect是没问题的,但是因为是在run里做操作,run是新的线程,必须显式的调用消息循环 你在最后面加上一句: this->exec(); 这样会显示的调用消息循环进而触发slot
soloopin 2013-02-15
  • 打赏
  • 举报
回复
引用 4 楼 openXMPP 的回复:
void Mng::run() 你不应该在这个线程里做new 和 connect的操作 要在外面的主线程 new完object后connect

Mng::Mng()
{
    manager = new QNetworkAccessManager(this);
    request = new QNetworkRequest();
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
}
Mng::~Mng()
{
    delete manager ;
    delete reply;
    delete request ;
}

void Mng::run()
{

    request->setUrl(QUrl("http://www.oschina.net"));
    reply = manager->get(*request);

}
这样么? 还是一样的报错结果。
乔巴好萌 2013-02-15
  • 打赏
  • 举报
回复
void Mng::run() 你不应该在这个线程里做new 和 connect的操作 要在外面的主线程 new完object后connect
soloopin 2013-02-15
  • 打赏
  • 举报
回复
我的目的是用多个线程,每个线程负责下载一个网页,然后把内容传给主线程。不知道这该怎么处理呢?
soloopin 2013-02-15
  • 打赏
  • 举报
回复
回楼上,我没有窗口啊
AccuVision 2013-02-15
  • 打赏
  • 举报
回复
子窗口和父窗口在不同的线程。

65,194

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧