Qt 使用QNetworkAccessManager和QNetworkReply进行超时处理
我们面临QNetworkAccessManager和用于网络超时检测的QTimer的计时问题。但是,我们不清楚什么时候开始这些qtimer 我们的第一次尝试是在get请求之后直接启动计时器。但这会导致在高负荷下过早流产。显然,QNetworkAccessManager自己进行排队,甚至在将请求放到线路上之前,超时就会触发Qt 使用QNetworkAccessManager和QNetworkReply进行超时处理,qt,connectivity,qnetworkaccessmanager,qtimer,qnetworkreply,Qt,Connectivity,Qnetworkaccessmanager,Qtimer,Qnetworkreply,我们面临QNetworkAccessManager和用于网络超时检测的QTimer的计时问题。但是,我们不清楚什么时候开始这些qtimer 我们的第一次尝试是在get请求之后直接启动计时器。但这会导致在高负荷下过早流产。显然,QNetworkAccessManager自己进行排队,甚至在将请求放到线路上之前,超时就会触发 QNetworkReply *reply = _qnam->get(someRequest); // connect standard handlers of our
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);
感觉我们不可能是第一个面对这个问题的人
谢谢 不幸的是,这是Qt中缺少的功能。任何修复都需要对Qt进行修补,除非您愿意深入了解Qt的内部结构。不幸的是,这是Qt中缺少的功能。任何修复都需要对Qt进行补丁,除非您愿意深入了解Qt的内部结构。