• 6605阅读
  • 3回复

诡异的QNetworkReply [复制链接]

上一主题 下一主题
离线aegirsega
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-25
我用QNetworkAccessManager写了个程序,现在发现个奇怪的问题
finished()信号中的QNetworkReply的url只在一个特别的情况下才正确
程序如下:


  1. void chk_core::dochecknow()
  2. {
  3.     QMessageBox::critical(NULL,"debug","begin check..");
  4.     QString baseurl,ustr,id;
  5.     QUrl u;
  6.     QNetworkReply *r;
  7.     QNetworkRequest q;
  8.     QStringList book_id_list;
  9.     book_id_list=books->childGroups();
  10.     baseurl=config->value("main/bookupdateinfourl").toString();
  11.     for(int iii=0;iii<book_id_list.count();iii++)
  12.     {id=book_id_list.value(iii);
  13.         ustr=baseurl;
  14.         u.setUrl(ustr.replace("#",id));
  15.         q.setUrl(u);
  16.         r=down_m.get(q);
  17.         list_for_parse.insert(r,id);//QHash<QNetworkReply*,QString>list_for_parse;
  18. QMessageBox::critical(NULL,"r.url",r->url().toString());//神奇语句
  19.     }
  20. }

  1. void chk_core::proc_down_finish(QNetworkReply *rrr)
  2. {
  3.     QString xcontent;
  4.     QString id;
  5.    QMessageBox::critical(NULL,"rrr.url",rrr->url().toString());//如果第一个函数中没有那句神奇的语句,这句会发现url永远都是第一个函数for语句中加入的第一个url,QNetworkReply*的个数一个不少,但地址不对
  6.     if(!list_for_parse.contains(rrr))return;
  7.     id=list_for_parse.value(rrr);
  8.     xcontent=rrr->readAll();
  9.     //QMessageBox::critical(NULL,"ss")
  10.     parse_update_info(id,xcontent);
  11.     list_for_parse.remove(rrr);
  12.     rrr->deleteLater();
  13.     if(list_for_parse.isEmpty())
  14.     {
  15.         //全部检查完毕
  16.     }
  17. }

第一段代码中18行这句,大家一看就知道根本没有用处,只是用来观察调试
但是没有这句,第二段槽函数里rrr的url永远都是唯一的一个,不会是应该出现的几个不同的值

我测试的时候传入
http://www.qidian.com/BookReader/1912296.aspx
http://www.qidian.com/BookReader/1914496.aspx
http://www.qidian.com/BookReader/1950108.aspx
三个url,如果没有18行那句,那么第二段代码三次获得的QNetworkReply参数的url都是
http://www.qidian.com/BookReader/1950108.aspx
我看不懂了,请教教

[ 此帖被aegirsega在2011-05-25 14:49重新编辑 ]
离线chuong

只看该作者 1楼 发表于: 2011-05-25
QNetworkAccessManager呢?信号槽连接了么?
离线aegirsega
只看该作者 2楼 发表于: 2011-05-25
连接了,有那句应该该没用的语句在里面的时候程序是很正常的,就是那句没用的话去不掉
离线swift19221
只看该作者 3楼 发表于: 2011-11-18
r=down_m.get(q);
是异步调用,
r.url的更新需要系统内部的事件处理来完成,
所以如果在子线程中执行,一定要启动事件循环 exec();
快速回复
限100 字节
 
上一个 下一个