Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 使用QNetworkAccessManager和QNetworkReply进行超时处理_Qt_Connectivity_Qnetworkaccessmanager_Qtimer_Qnetworkreply - Fatal编程技术网

Qt 使用QNetworkAccessManager和QNetworkReply进行超时处理

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

我们面临QNetworkAccessManager和用于网络超时检测的QTimer的计时问题。但是,我们不清楚什么时候开始这些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()
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的内部结构。