代码之家  ›  专栏  ›  技术社区  ›  Idan K

Qt带宽限制

  •  2
  • Idan K  · 技术社区  · 15 年前

    我正在使用QNetworkAccessManager从Web下载文件,它为任务提供了一个简单的API。但是我希望给这个类添加一个下载速率限制,这样所有的HTTP回复都不会超过这个限制(我看不到任何限制请求的理由)。

    我在谷歌上找到了一个有趣的帖子 here . 但是它所做的是子类qtcpsocket,并使用管理一组套接字的单独类来控制带宽。虽然这很好,但我想继续使用QNetworkAccessManager类。

    在我看来,我可以:

    1. 子类qnetworkaccessmanager并以某种方式集成子类qtcpsocket(这可能涉及到更多类的子类,qhttp*类)。
    2. 使用本文中提供的类,围绕这些类构建我自己的QNetworkAccessManager。
    3. QNetworkAccessManager允许使用代理。我可以编写一个假代理类,其中包含带宽限制逻辑。但在我看来这是一个丑陋的黑客。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Idan K    15 年前

    我最终使用了rctcpsocket和ratecontroller this article 和QHTTP类。在使用qhttp发出get/post请求之前,我创建了一个rctcpsocket,将其添加到我的ratecontroller中,并使用qhttp::setsocket(qtcpsocket*)。我仍然没有找到一个可以继续使用QNetworkAccessManager的解决方案,但这已经足够接近了,而且效果非常好。

        2
  •  0
  •   Florian    15 年前

    您应该看看QNetworkReply::setReadBufferSize(qint64大小)。我引用文件:

    一旦缓冲区满了(即bytesavailable()返回大小或更多),qnetworkreply将尝试停止从网络读取,从而导致 下载以减速 也。如果缓冲区的大小不受限制,qnetworkreply将尝试从网络上尽快下载。

    我想你可以利用这个值,也许你从downloadprogress()信号中得到的值来降低速度。我觉得很难弄清楚它的精确性,但它可能是可行的。