1

我们正面临使用 QNetworkAccessManager 和 QTimers 进行网络超时检测的计时问题。虽然,我们不清楚何时启动这些 QTimer。

我们的第一个尝试是在获取请求后直接启动计时器。但这会导致在高负载下过早中止。显然 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()or内启动计时器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);

感觉我们不可能是第一个面对这个问题的人。

谢谢!

4

0 回答 0