• 15254阅读
  • 6回复

QThread 里面不能使用QNetworkAccessManager ? [复制链接]

上一主题 下一主题
离线hendry
 
只看楼主 倒序阅读 楼主  发表于: 2009-08-25
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —


不使用QThread的情况下 程序运行很正常

当把涉及到QNetworkAccessManager 的处理的代码放到run下面的时候

发现根本就没有网络通讯


比如:

extern int abc;

void myThread::run() {
    QNetworkAccessManager *manager = new QNetworkAccessManager;
    connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(_slotManagerFinished(QNetworkReply *)));
    QUrl getUrl = QUrl("http://whatever/path");
    QNetworkRequest req;
    req.setUrl(getUrl);
    req.setRawHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)");
    QNetworkCookieJar * jar = new QNetworkCookieJar;
    manager->setCookieJar(jar);
    manager->get(req);
}


void myThread::_slotManagerFinished(QNetworkReply  * reply){
     abc++;
}




上面的代码中   URL替换掉了  是一个绝对可以访问的URL

manager->get(req);

这句运行后,服务端查看并没有收到任何数据包

abc 这个变量是个全局变量 ,那个SLOT也没有运行    值也没有任何改变

猜测原因是不是因为 QNetworkAccessManager 本身就是在Thread中运行的 ?

所以QNetworkAccessManager  不能在自定义的子进程中工作?

    QNetworkAccessManager *manager = new QNetworkAccessManager; 这一句如果改成
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    运行的过程中会报错:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is myThread(0x98f6e10), parent's thread is QThread(0x98d08a0), current thread is myThread(0x98f6e10)


有遇到过这样类似的问题的吗?

不过照常理来说 ,QNetworkAccessManager很可能是运行在子进程里,
因为在一个QWidget主进程里面使用 QNetworkAccessManager 即使请求的URL不能访问 , 也不会造成阻塞, 窗口还是很正常,从不会出现无法响应
那如果要并发使用多个QNetworkAccessManager 对象来get  应该怎么写呢?

离线beajisong

只看该作者 1楼 发表于: 2009-08-29
你的QNAM可以直接在线程栈上建立
而且run的最后一句为exec()
这样QNAM会跑在当前线程的事件循环上

你现在的QNAM属于了当前线程的上下文
但是,当前线程没有事件循环,处理不了QNMA的信号和槽
离线beajisong

只看该作者 2楼 发表于: 2009-08-29
啊对

QObject: Cannot create children for a parent that is in a different thread.
(Parent is myThread(0x98f6e10), parent's thread is QThread(0x98d08a0), current thread is myThread(0x98f6e10)


这个是因为当前QThread属于主事件循环,不能给this
你就按我说的做就OK
离线hendry
只看该作者 3楼 发表于: 2009-09-01
果然可以了  

谢谢

但是我看了文档  不是特别的理解
麻烦能指点下吗?
特别是QT里面的 父子线程运行的机制概念类的东西
离线hendry
只看该作者 4楼 发表于: 2009-09-01
而且发现反而多线程更慢啊 不解
离线beajisong

只看该作者 5楼 发表于: 2009-09-03
不会更慢的,还是没弄好
QThread的所有部分除了run()函数都是属于创建者(你这里就是主线程的)
ruN()是真正的线程体
而且如果run()里面有事件循环(exec())那么,在DirectConnection属性的信号槽连接就会在这个子线程里执行
Qt的线程体系其实有点点复杂,特别是各种连接属性和信号激发方式混用时
离线twides
只看该作者 6楼 发表于: 2011-06-13
嗯……谢谢啦,最近一直在纠结线程和    QNetworkAccessManager的问题
快速回复
限100 字节
 
上一个 下一个