ネットワーク タイムアウト検出のための QNetworkAccessManager と QTimers のタイミングの問題に直面しています。ただし、これらの QTimer をいつ開始するかは明確ではありません。
最初の試みは、get リクエストの直後にタイマーを開始することでした。しかし、これは高負荷下での早期アボートにつながります。どうやら 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()
2 番目の試行は、最初のまたは内でタイマーを開始すること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);
この問題に直面するのは私たちだけではないようです。
ありがとう!