gpt4 book ai didi

c++ - 如何在没有外部计时器的情况下设置 QNetworkReply 超时?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:48 25 4
gpt4 key购买 nike

是否可以为QNetworkReply设置一个超时时间,这样很长时间没有来自服务器的回复,它可以发出finished()信号?

最佳答案

不使用计时器是不可能的,但您不必显式编写计时器代码。该功能可以巧妙地打包到静态函数中,就像超时是回复的可设置属性一样 - 请参见下面的示例。

有两个问题:

  1. 如何处理正在进行的请求的超时。

  2. 如何确定网络请求是否已开始处理。此问题已在 this question 中解决.

一个简单的超时处理程序可以如下实现(源自 this answer )。该代码可跨 Qt 4 和 Qt 5 移植。

您可以选择 abort-ing请求超时(默认),或 close-ing它。前者立即释放网络资源,后者允许请求完成但丢弃接收到的任何数据,最适用于上传请求。

class ReplyTimeout : public QObject {
Q_OBJECT
public:
enum HandleMethod { Abort, Close };
ReplyTimeout(QNetworkReply* reply, const int timeout, HandleMethod method = Abort) :
QObject(reply), m_method(method)
{
Q_ASSERT(reply);
if (reply && reply->isRunning()) {
m_timer.start(timeout, this);
connect(reply, &QNetworkReply::finished, this, &QObject::deleteLater);
}
}
static void set(QNetworkReply* reply, const int timeout, HandleMethod method = Abort)
{
new ReplyTimeout(reply, timeout, method);
}
protected:
QBasicTimer m_timer;
HandleMethod m_method;
void timerEvent(QTimerEvent * ev) {
if (!m_timer.isActive() || ev->timerId() != m_timer.timerId())
return;
auto reply = static_cast<QNetworkReply*>(parent());
if (reply->isRunning())
{
if (m_method == Close)
reply->close();
else if (m_method == Abort)
reply->abort();
m_timer.stop();
}
}
};

使用:

QNetworkAccessManager networkAccessManger;
QNetworkReply* reply =
networkAccessManger.get(QNetworkRequest(QUrl("https://www.google.com")));
ReplyTimeout::set(reply, 100);

关于c++ - 如何在没有外部计时器的情况下设置 QNetworkReply 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37444539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com