Обработка тайм-аута с помощью QNetworkAccessManager и QNetworkReply
Мы сталкиваемся с проблемами синхронизации с QNetworkAccessManager и QTimers для определения времени ожидания сети. Хотя нам не ясно, когда запускать эти QTimers.
Нашей первой попыткой было запустить таймер сразу после получения запроса. Но это приводит к преждевременным прерываниям при высокой нагрузке. Очевидно, QNetworkAccessManager создает собственную очередь, и время ожидания срабатывает еще до того, как он отправляет запрос в сеть.
QNetworkReply *reply = _qnam->get(someRequest);
// connect standard handlers of our application
QObject::connect(reply, &QNetworkReply::finished, [reply] {
handle(reply);
});
// do timeout handling using QTimers in "global" scope
timeoutTimer.setSingleShot(true);
QObject::connect(&timeoutTimer, &QTimer::timeout, [reply] { reply->abort(); });
timeoutTimer.start(timeout);
Вторая попытка была запустить таймер внутри первого QNetworkAccessManager::uploadProgress()
или же QNetworkAccessManager::uploadProgress()
, но это не работает при отсутствии подключения к сети. Очевидно, что никогда не сообщается о каком-либо прогрессе, и время ожидания не начинается с самого начала.
QNetworkReply *reply = _qnam->get(someRequest);
// connect standard handlers of our application
QObject::connect(reply, &QNetworkReply::finished, [reply] {
handle(reply);
});
// do timeout handling using QTimers in "global" scope
auto timerSetOrReset = [reply] {
if (!timeoutTimer.isActive()) {
timeoutTimer.setSingleShot(true);
QObject::connect(&timeoutTimer, &QTimer::timeout, [reply] { reply->abort(); });
}
timeoutTimer.start(timeout);
};
QObject::connect(reply, &QNetworkReply::uploadProgress, timerSetOrReset);
QObject::connect(reply, &QNetworkReply::downloadProgress, timerSetOrReset);
Такое ощущение, что мы не можем первыми столкнуться с этой проблемой.
Спасибо!