2

我正在使用 QNetworkAccessManager 从 Web 下载文件,它为任务提供了一个简单的 API。但我希望为类添加下载速率限制,因此所有 http 回复都不会超过该限制(我认为没有理由限制请求)。

我用谷歌搜索了一下,在这里发现了一个有趣的帖子。但它所做的是 QTcpSocket 的子类,并使用管理一组套接字的单独类来控制带宽。虽然这很好,但我想继续使用 QNetworkAcessManager 类。

我看到它的方式可以:

  1. 子类 QNetworkAccessManager 并以某种方式集成子类 QTcpSocket(这可能涉及子类化更多类,QHttp* 类)。
  2. 使用文章中提供的类并围绕它们构建我自己的 QNetworkAccessManager。
  3. QNetworkAccessManager 允许使用代理。我可以编写一个虚假的代理类,其中包含带宽限制逻辑。但这对我来说似乎是一个丑陋的黑客。

虽然前两个选项是可能的,但我想知道是否有更简单的方法可以做到这一点?如果不是,你会推荐哪一个?

4

2 回答 2

1

我最终将本文中的 RcTcpSocket 和 RateController与 QHttp 类一起使用。在使用 QHttp 发出 get/post 请求之前,我创建了一个 RcTcpSocket,将它添加到我的 RateController 并使用 QHttp::setSocket(QTcpSocket*)。我仍然没有找到继续使用 QNetworkAccessManager 的解决方案,但这已经足够接近并且效果很好。

于 2009-04-15T08:12:50.047 回答
0

你应该看看 QNetworkReply::setReadBufferSize(qint64 size)。我引用文档:

一旦此缓冲区已满(即 bytesAvailable() 返回大小或更多),QNetworkReply 将尝试停止从网络读取,从而导致下载也减速。如果缓冲区的大小不受限制,QNetworkReply 将尝试尽可能快地从网络下载。

我猜你可以使用这个值,也许你从 downloadProgress() 信号中得到的值可以减慢速度。我认为它应该很难得到精确的东西,但它可能是可行的。

于 2009-04-08T14:03:37.197 回答