1

ネットワーク タイムアウト検出のための 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);

この問題に直面するのは私たちだけではないようです。

ありがとう!

4

0 に答える 0