【问题标题】:How to synchronize QNetworkAccessManager?如何同步 QNetworkAccessManager?
【发布时间】:2013-08-29 12:54:52
【问题描述】:

我的deleteIdList 变量来自replyFinished(QNetworkReply*) 函数。但是deleteIdList 变量返回空。但是,它必须返回任何东西..我想同步QNetworkAccessManager..

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));

    foreach (QString delIdList, deleteIdList) {

    serviceUrl = "http://localhost:8080/limit_id="+delIdList+"&false";
    requestUrl = QString("%1%2:%3%4").arg(scheme).arg(qstr).arg(QString::number(svcPort)).arg(serviceUrl);

    QUrl url(requestUrl);
    QNetworkRequest request;
    request.setUrl(url);
    manager->get(request);

  }

QNetworkAccessManager如何同步?

【问题讨论】:

    标签: c++ qt asynchronous synchronization


    【解决方案1】:

    我可能会迟到,但我认为它可以帮助其他人面临这个问题。

    QNetworkAccessManager *networkMgr = new QNetworkAccessManager(this);
    QNetworkReply *reply = networkMgr->get( QNetworkRequest( QUrl( "http://www.google.com" ) ) );
    
    QEventLoop loop;
    QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit()));
    
    // Execute the event loop here, now we will wait here until readyRead() signal is emitted
    // which in turn will trigger event loop quit.
    loop.exec();
    
    // Lets print the HTTP GET response.
    qDebug( reply->readAll());
    

    Source : developer.nokia.com

    【讨论】:

      【解决方案2】:

      呃……你在做什么?您创建了一个 QNetWorkManager,将完成的信号连接到一个 replyFinished 插槽并期望得到一个结果,它来自于您发送请求之前的 replyFinished?抱歉,但从我在您的代码中看到的情况来看,我会说它无法修复。

      foreach (QString delIdList, deleteIdList) 必须在 replyFinished 槽中,当 deleteIdList 不知何故是您的请求的结果时。还有

          QUrl url(requestUrl);
          QNetworkRequest request;
          request.setUrl(url);
          manager->get(request);
      

      必须在您的连接下方的循环之外。但是,当然,您的代码非常错误,以至于我的“提示”只是对您可能打算做什么的粗略猜测。

      【讨论】:

      • 我在做:replyFinished函数中有deleteIdList..而且这个函数必须返回deleteIdList..之后我想使用这个变量..@的每个元素987654326@ 是我的 ID 值。因此,每个 ID 必须单独请求 manager->get(request)
      【解决方案3】:

      这个问题有点难以理解——但我有一些建议,那就是:永远不要使用 QNetworkAccessManager 的完成信号。而是连接到 QNetworkReply 的已完成插槽。

      QNetworkAccessManager *manager = new QNetworkAccessManager(this);
      
      foreach (QString delIdList, deleteIdList) {
      
          serviceUrl = "http://localhost:8080/limit_id="+delIdList+"&false";
          requestUrl = QString("%1%2:%3%4").arg(scheme).arg(qstr).arg(QString::number(svcPort)).arg(serviceUrl);
      
          QUrl url(requestUrl);
          QNetworkRequest request;
          request.setUrl(url);
          QNetworkReply *reply = manager->get(request);
          connect(reply,SIGNAL(finished()),this,SLOT(replyFinished()));
      }
      

      然后在replyFinished 槽中你可以调用sender() 来接收一个指向回复的指针。通过这种方式,您可以“同步”并找出哪个回复属于哪个请求。

      【讨论】:

      • 我不明白这对他有什么帮助。据他说:我的 deleteIdList 变量来自 replyFinished(QNetworkReply*)。那么这个“deleteIdList”是如何从replyFinished() 槽反馈到他的foreach 循环中的呢?我认为我们可以指出错误,但我们没有足够的信息来正确地做到这一点。
      • 同意。这个问题令人困惑,我不确定他在问什么。这只是基于对可能不是以英语为母语的问题的一种可能解释提出的建议。
      • 我要等待回复replyFinished(QNetworkReply*)函数..:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2021-11-08
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多