Выполнить несколько URL-запросов в цикле в Qt - PullRequest
2 голосов
/ 22 апреля 2010

В Qt мне нужно подключиться и проверить наличие обновлений на нескольких серверах, и для этого я использую QNetworkAccessManager.Проблема в том, что я не хочу подключаться к следующему URL-адресу, пока текущий запрос не ответит и не будет завершен.Моя первая идея состояла в том, чтобы использовать цикл, как показано ниже, но затем у меня возникла проблема с тем, что я не хочу подключаться к следующему URL-адресу до тех пор, пока не закончится текущий.

void connect() {
    for (int index = 0; index < 20; index++) {
        //I need to use this QSqlQuery to get some data here
        QSqlQuery query;
        QString sqlString = getSql(index);
        query.exec(sqlString);
        .....

        if (needUpdate(index)) { //Check if I need to connect to this url
            QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this); 
            connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(finishedSlot(QNetworkReply*)));
            QUrl url = getUrl(index); //Get the url based on the current index
            networkAccessManager->get(QNetworkRequest(url));
        }
    }
} 

void finishedSlot(QNetworkReply* reply) {

// Делать больше вещей}

Моя другая идея для решения этой проблемы заключалась в том, чтобы построить ее следующим образом:

int index;

void connect() {
        /*I need to use this QSqlQuery to get some data here, 
          it works perfect when just looping like before, but when using 
          this solution I get memory problems, 
         it seems like it doesn't delete the query*/
        QSqlQuery query;
        QString sqlString = getSql(index);
        query.exec(sqlString);
        ..... 


    if (needUpdate(index)) { //Check if I need to connect to this url
        QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this); 
        connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(finishedSlot(QNetworkReply*)));
        QUrl url = getUrl(index); //Get the url based on the current index
        networkAccessManager->get(QNetworkRequest(url));
    } else {
        index++;
        connect(); //Request next url
    }
}

void finishedSlot(QNetworkReply* reply) {
//Do more stuff
    index++;
    connect(); //Request next url
}

Теперь следующий URL не будет запрошен до завершения текущего URL.Проблема с этим решением состоит в том, что у меня есть некоторые проблемы, связанные с тем, что многие подключения () и FinishSlot () будут открыты одновременно, и вещи, которые я создаю в этих методах, не будут удалены, и это вызовет проблемы с памятью.Я знаю, что это как-то связано с query.exec (sqlString), потому что без этого все работает так, как должно.Но почему это так сильно отличается между этими двумя решениями?

Как бы вы решили это?

1 Ответ

0 голосов
/ 22 апреля 2010

Запуск новых запросов из слота готового () звучит хорошо. Просто убедитесь, что вы также выполняете reply-> deleteLater () после завершения одного из ответов.

...