2

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 つのソリューション間でこれほど異なるのでしょうか?

これをどのように解決しますか?

4

1 に答える 1

0

finish()スロットから新しいリクエストを起動するのは良いことだと思います。返信の1つが終了したら、必ずreply-> deleteLater()も実行してください。

于 2010-04-22T14:48:48.557 に答える