在读取QNetwork时,我希望有一个超时。如果读取数据的时间超过30秒(不是超时,服务器没有关闭,连接没有中断,连接没有关闭,连接仍然处于活动状态,我仍然在接收数据)。我需要stop+close QNetwork在X秒后,即使服务器仍在运行和发送数据。我怎么能这么做?
发布于 2018-03-27 05:53:29
您可以在单热模式下将QTimer
连接到您的QNetworkReply
纯虚拟插槽abort()
。
QTimer timer;
timer.setSingleShot(true);
// connect the timer to the reply
connect(&timer, SIGNAL(timeout()), &networkReply, SLOT(abort())));
// start your timer
timer.start(30000);
要获取当前数据,请在中止方法的实现中执行该操作,然后调用close()
。
QNetworkReply
是一个QIODevice
,所以您可以使用readAll()
方法。
发布于 2018-03-27 19:52:28
数据的接收可用作连接已建立的指示符。这可以用来触发超时。
因此:
void onTimeout(QNetworkReply *reply, int msec, std::function<void(const QByteArray &)> fun) {
auto call = [=]{
auto const data = reply->readAll();
if (!reply->isFinished())
reply->abort();
fun(data);
};
if (!reply->bytesAvailable()) {
QPointer<QObject> conn = new QObject(reply);
// single-shot connection
connect(reply, &QNetworkReply::downloadProgress, conn, [=](qint64 a, qint64 s){
if (a && s) {
QTimer::singleShot(msec, reply, call);
delete conn;
}
});
}
}
https://stackoverflow.com/questions/49514182
复制