В 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), потому что без этого все работает так, как должно.Но почему это так сильно отличается между этими двумя решениями?
Как бы вы решили это?