Qt では、複数のサーバーに接続して更新を確認する必要があり、そのために QNetworkAccessManager を使用しています。問題は、現在のリクエストが応答して終了するまで、次の URL に接続したくないことです。私の最初のアイデアは、以下のようなループを使用することでしたが、現在の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 が要求されることはありません。このソリューションの問題は、これらのメソッドで作成したものが削除されず、同時に多くの connection() と finishedSlot() が開かれ、メモリの問題が発生するという問題があることです。query.exec(sqlString) と関係があることはわかっています。これがないと、すべてが正常に機能するからです。しかし、なぜこれら 2 つのソリューション間でこれほど異なるのでしょうか?
これをどのように解決しますか?