如何在没有外部计时器的情况下设置 QNetworkReply 超时
How to set QNetworkReply timeout without external timer?
是否可以为QNetworkReply
设置超时,所以很长一段时间没有来自服务器的回复,它可以发出finished()
信号?
不使用计时器是不可能的,但您不必显式编写计时器代码。该功能可以整齐地打包到一个静态函数中,该函数就像超时是回复的可设置属性一样 - 请参阅下面的示例。
有两个问题:
-
如何处理正在进行的请求超时。
-
如何确定网络请求是否已开始处理。此问题已在此问题中解决。
一个简单的超时处理程序可以实现如下(从这个答案派生)。该代码可在Qt 4和Qt 5之间移植。
您可以选择在超时时abort
请求(默认值)或close
请求。前者立即释放网络资源,后者允许请求完成,但丢弃收到的任何数据,并且对上传请求最有用。
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);
在
Qt 5.15中,它应该是一个内置功能 - 刚刚发现修复了一个10年前的错误:)https://codereview.qt-project.org/c/qt/qtbase/+/278064
相关文章:
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 如何在没有复制构造函数的情况下为地图设置值?
- 如何在不设置值的情况下通知 c++ 未来?
- 有没有一种方法可以在不设置精度的情况下设置小数位数
- 如何在没有setter的情况下设置类内部类的成员变量?
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 如何在不使用命名空间标准的情况下取消设置ios::fixed
- 如何在不设置完整路径的情况下访问 c++ 中的资源
- 如何在没有 iomanip 的情况下设置没有头文件的精度
- 如何在不使用 C++ 中的管理员权限的情况下设置 AD 属性值
- 如何在没有外部计时器的情况下设置 QNetworkReply 超时
- 在没有"线程管理"的情况下C++设置并发哈希表/哈希?
- 在给定两个排序向量的情况下设置减法
- 在不使用流(ios_base::precision)的情况下设置双精度
- Eclipse Mars - 为C++项目设置默认设置(默认情况下设置 c++11)
- 如何在不提示输入密码的情况下设置计划任务
- 使用WIN32 API在没有资源的情况下设置程序图标
- 如何在不使用位掩码的情况下设置Integer中的位
- 如何在不更改所有文本颜色的情况下设置单个单词的颜色
- 如何在不知道旧密码的情况下设置用户帐号密码