Обработка тайм-аута с помощью 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);

Такое ощущение, что мы не можем первыми столкнуться с этой проблемой.

Спасибо!

0 ответов

Другие вопросы по тегам