QNetworkAccessManager 稍后在添加请求时删除

QNetworkAccessManager delete later while requests are added

本文关键字:请求 删除 添加 QNetworkAccessManager      更新时间:2023-10-16

我有一个QNetworkAccessManager来处理我的所有请求。 管理器可以在应用程序运行时接收发送发布请求的操作。 我注意到在没有互联网的情况下,QNetworkReply 完成之前几乎有 70 秒的超时时间。

在类的构造函数中,我使用以下命令创建管理器:

mgr = new QNetworkAccessManager(this);
connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));
connect(mgr,SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)),this,SLOT(handleSSLErrors(QNetworkReply *, const QList<QSslError> &)));

创建请求时:

QNetworkReply * reply = mgr->post(request, payload);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, 
SLOT(slotError(QNetworkReply::NetworkError)));

对于网络回复,我有一个信号槽:

connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));

我用rep->deleteLater();删除了请求完成方法中的QNetworkRep。

有了这个,我希望所有QNetworkReprat自动删除。

在我运行的类的解构器

delete mngr

我的想法: 0:00 我发送请求。 0:01 我删除了 mngr(它会自动删除已完成的插槽( 1:10 请求完成,不再有插槽,因此不调用 deleteLater((。

删除"QNetworkAccessManager"的正确方法是什么,我的应用程序可能每 60 秒发送一次超时 70 秒的请求(意味着始终有一个正在进行的请求(。如何在不产生内存泄漏的情况下删除 qnetworkmanager?

connect(mgr, &QNetworkAccessManager::destroyed, reply, &QNetworkReply::deleteLater); 

QObjects提供destroyed()信号。因此,您可以将经理destroyed()与打开的回复deleteLater()联系起来。当您的经理被销毁时,所有打开的回复都将被删除。如果回复结束时管理器仍然活着,您可以像已经调用的那样显式调用deleteLater(),这将防止回复在销毁管理器之前徘徊。