Qt开源网络库[6]-超时功能

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

距离上一系列篇已经有半年没有更新了。本次介绍该网络库最近新增的超时功能(超时中断请求)。由于Qt的网络请求不能设置超时时间,故只能额外封装了。

接口

  • timeout通过msec参数设置超时时间;
  • msec <= 0则禁用超时功能;
  • msec > 0则使能超时功能,并将超时时间设置为msec毫秒。
/**
 * @brief msec <= 0, disable timeout
 *        msec >  0, enable timeout
 */
HttpRequest &timeout(const int &msec = -1);

实现

  • HttpResponseTimeout构造函数传递QNetworkReplytimeout参数用于超时中断设置;
  • QTimer::singleShot为单次定时器;
  • 当定时器超时后则会执行onTimeout函数;
  • onTimeout函数会执行QNetworkReplyabortdeleteLater来完成请求中断。
class HttpResponseTimeout : public QObject {
    Q_OBJECT
public:
    HttpResponseTimeout(QNetworkReply *parent = NULL, const int timeout = -1) : QObject(parent) {
        if (timeout > 0)
            QTimer::singleShot(timeout, this, SLOT(onTimeout()));
    }

private slots:
    void onTimeout() {
        QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
        if (reply->isRunning()) {
            reply->abort();
            reply->deleteLater();
        }
    }
};

示例

  • 使用示例设置30秒的超时时间,超时结束后将会强制中断当前请求。
static HttpService http;
http.get("http://www.qtbig.com")
    .onResponse(this, SLOT(finish(QByteArray))) /* 接收数据 */
    .onResponse(this, SLOT(downloadProgress(qint64,qint64))) /* 接收进度 */
    .onError(this, SLOT(error(QNetworkReply::NetworkError, QNetworkReply*))) /* 错误处理 */
    .timeout(30*1000) /* 30s */
    .exec();

猜你喜欢

转载自blog.csdn.net/nicai_xiaoqinxi/article/details/91900271