在Qt中的一个循环中运行多个url请求

在Qt中的一个循环中运行多个url请求,qt,request,qnetworkaccessmanager,Qt,Request,Qnetworkaccessmanager,在Qt中,我需要连接并检查几个服务器上的更新,为此,我使用QNetworkAccessManager。问题是,在当前请求得到响应并完成之前,我不想连接到下一个url。我的第一个想法是使用下面这样的循环,但是我有一个问题,在当前url完成之前,我不想连接到下一个url void connect() { for (int index = 0; index < 20; index++) { //I need to use this QSqlQuery to get som

在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) {
现在,在当前url完成之前,不会请求下一个url。这个解决方案的问题是,我有一些问题,因为许多connection()和finishedSlot()将同时打开,我在这些方法中创建的内容不会被删除,这将导致内存问题。我知道它与query.exec(sqlString)有关,因为没有它,一切都会正常工作。但为什么这两种解决方案之间会有如此大的差异


如何解决这个问题?

从finished()槽启动新请求听起来不错。
只要确保在其中一个回复完成后也执行reply->deleteLater()。

从finished()槽启动新请求听起来不错。
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) {

只要确保在其中一个回复完成后也执行reply->deleteLater()。

谢谢!是的,在finishedSlot()中使用deleteLater()是个好主意。我在上面补充了一些信息。内存泄漏问题似乎与QSqlQuery.exec()有关,因为它在第一种解决方案中工作得非常完美,但在第二种解决方案中,它似乎会泄漏内存。你能看出第二种解决方案有什么问题吗?啊。您正在创建一个新的QNetworkAccessManager。每个应用程序应该有一个QNetworkAccessManager!它可以毫无问题地处理多个请求。谢谢!是的,在finishedSlot()中使用deleteLater()是个好主意。我在上面补充了一些信息。内存泄漏问题似乎与QSqlQuery.exec()有关,因为它在第一种解决方案中工作得非常完美,但在第二种解决方案中,它似乎会泄漏内存。你能看出第二种解决方案有什么问题吗?啊。您正在创建一个新的QNetworkAccessManager。每个应用程序应该有一个QNetworkAccessManager!它可以毫无问题地处理多个请求。您的漏洞可能来自创建QNetworkAccessManager实例而从不删除它。您可以将QNetworkAccessManager的signal finished()信号连接到它的deleteLater插槽,或者执行一些自定义操作,或者在父级销毁时执行清理。您的泄漏可能来自创建QNetworkAccessManager的实例而从未删除它。您可以将QNetworkAccessManager的signal finished()信号连接到它的deleteLater插槽,或者执行一些自定义操作,或者在父级销毁时执行清理。
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) {