www.state-it.info

Gran base de respuestas a las preguntas de los desarrolladores
Header decor

Cómo implementar la espera de la finalización de la consulta con QNetworkAccessManager en Qt?

terminator-light 2018-04-26 13:52:09

En el internet hay ejemplos de cómo ponerlo en práctica con la conexión de la ranura a la señal de QNetworkReply::finished con QEventLoop, y a QNetworkAccessManager::replyFinished no encontrado. Dentro del controlador, después de obtener los datos a partir de ellos aún se envía la solicitud y así se repite.
También quisiera saber como se puede poner el tiempo de espera. Si en el plazo de 3 segundos no se pudo conectar, lo envía a la otra consulta.

Total answers: 1

IGHOR 2018-04-26 16:13:24

QNetworkAccessManager manager;
QEventLoop loop;
QObject::connect(&manager, QOverload<QNetworkReply*>::of(&QNetworkAccessManager::finished),
                 &loop, &QEventLoop::quit);
...
loop.exec();

Y para el tiempo de espera puede causar QTimer::singleShot(3000, &loop, &QEventLoop::quit);

PS: se debe evitar bloqueos y procesar todo en las ranuras de la clase. Debe tenerse en cuenta que una sola instancia QNetworkAccessManager se limita a cuatro conexiones simultáneas.

terminator-light 2018-04-26 16:53:02

Que yo no lo hago, probablemente.
Escribiré псевдокодом:

конструктор(){
      manager = new QNetworkAccessManager(this);
      connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(replyFinished(QNetworkReply*)));
    QObject::connect(manager, QOverload<QNetworkReply*>::of(&QNetworkAccessManager::finished),
                     &loop, &QEventLoop::quit);
  }

  void MainWindow::replyFinished(QNetworkReply* reply){
      if (reply->error() == QNetworkReply::NoError){
            if(needProxy){
                changeProxy();
                sendRequest();
                QTimer::singleShot(3000, &loop, &QEventLoop::quit);
            }
      }
      reply->deleteLater();
  }

  void MainWindow::onClicked(){
        sendFirstRequest();
        loop.exec():
  }

¿Por qué me espera, hasta que no reciba una respuesta, a pesar de que el tiempo de espera


IGHOR 2018-04-26 16:57:41

terminator-light, QTimer::singleShot(3000, &loop, &QEventLoop::quit); es necesario agregar antes de loop.exec():


IGHOR 2018-04-26 17:05:10

terminator-light, y a la vez tiene una ranura de replyFinished, lo mejor de su señal desde allí enviar &loop, &QEventLoop::quit


terminator-light 2018-04-27 21:14:17

IGHOR, Y?

конструктор(){
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), SLOT(replyFinished(QNetworkReply*)));
    QObject::connect(manager, QOverload<QNetworkReply*>::of(&QNetworkAccessManager::finished),
                     &loop, &QEventLoop::quit);
}

  void MainWindow::replyFinished(QNetworkReply* reply){
      if (reply->error() == QNetworkReply::NoError){
            if(url.contains("test1")){
                sendRequest("test/main1");
                
            }else if(url.contains("test2")){
                sendRequest("test/main2");
                
            }else if(url.contains("test3")){
                sendRequest("test/main3");
                
            }else{
                sendRequest("test/default");
                changeProxy();
            }
      }
      reply->deleteLater();
  }

  void MainWindow::sendRequest(const QString& url){
        manager->get(QNetworkRequest(QUrl(url)));
        QTimer::singleShot(3000, &loop, &QEventLoop::quit);
        loop.exec();
  }

  void MainWindow::onClicked(){
        sendRequest("test/default");
  }


IGHOR 2018-04-27 21:17:27

terminator-light, aunque el código de mal leemos, pero parece que debería funcionar h


terminator-light 2018-04-27 23:01:29

IGHOR, como que no funciona. Lo mismo espera la finalización de la consulta. Me es ahora suficiente para después de cambiar el proxy esperaba más de 3 seg, y si no llega la respuesta (es decir, el proxy no валиден), de cambiar el proxy y el eco de la petición


IGHOR 2018-04-28 17:12:24

terminator-light, es necesario rehacer la lógica de la aplicación y no a resolver los problemas en la frente


terminator-light 2018-04-28 18:08:16

IGHOR, perdón por mi inexperiencia y la importunidad, no saben ¿cómo puedo conseguir que la consulta se enviaba a través de un proxy en un periodo de tiempo especificado?


Preguntas relacionadas:

Footer decor

© www.state-it.info | Base of answers to questions for developers and programmers.