QNetworkAccessManager удалить позже, пока добавляются запросы - PullRequest
1 голос
/ 17 июня 2020

У меня есть один QNetworkAccessManager для обработки всех моих запросов. Менеджер может получить действие для отправки почтового запроса в любое время, когда приложение запущено. Я заметил, что время ожидания QNetworkReply составляет почти 70 секунд, когда нет inte rnet.

В конструкторе класса я создаю менеджер с помощью:

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*)));

Я удаляю репутацию QNetworkReply в методе requestFinished с помощью rep->deleteLater();.

При этом я ожидаю, что все QNetworkReply будут удалены автоматически.

В десктрукторе класса запускаю

delete mngr

мои мысли: 0:00 Отправляю запрос. 0:01 Я удаляю mngr (который автоматически удаляет завершенный слот) 1:10 запрос завершается, слота больше нет, поэтому deleteLater () не вызывается.

Каков правильный способ чтобы удалить «QNetworkAccessManager», возможно, мое приложение отправляет запрос каждые 60 секунд с таймаутом на 70 секунд (то есть всегда есть текущий запрос). Как удалить qnetworkmanager без утечки памяти?

1 Ответ

1 голос
/ 17 июня 2020
connect(mgr, &QNetworkAccessManager::destroyed, reply, &QNetworkReply::deleteLater); 

QObjects предлагает сигнал destroyed(). Так вы можете связать своих менеджеров destroyed() с открытыми ответами deleteLater(). Когда ваш менеджер будет уничтожен, все открытые ответы будут удалены. В случае, если ответ завершается, а менеджер все еще жив, вы явно вызываете deleteLater(), как вы уже делаете, что предотвратит задержку ответа до тех пор, пока вы не уничтожите менеджер.

...