3

我们是否可以QNetworkAccessManager通过限制下载速度来限制消耗整个带宽,因为我们确实看到几乎每个下载管理器都有这样的选项?

4

1 回答 1

2

这是开箱即用的。但是看看Qt Torrent Example,尤其是类RateControllerratecontroller.h | ratecontroller.cpp)。这个类不仅控制一个连接,而且控制一组连接,几乎可以满足您的要求。

但是,这个速率控制器正在运行QTcpSockets(确切地说是在PeerWireClients),所以你需要将“对等”的类型更改为QIODevice,我希望这并不难,因为PeerWireClient继承自QTcpSocket,它本身继承自QIODevice

 // old
 void addSocket(PeerWireClient *socket);
 // new
 void addDevice(QIODevice *device);

(注意 Torrent 示例中的 RateController 控制上传和下载,但您只需要控制下载速率。因此您可以删除不必要的代码。)

然后,您需要QNetworkAccessManager使用此速率控制器发出请求。这可以通过重新实现QNetworkAccessManager和覆盖(扩展)方法来完成QNetworkAccessManager::createRequest,每当创建新请求时都会调用该方法。此方法返回将从中读取下载的QNetworkReply*(继承自QIODevice*),因此告诉速率控制器控制此设备将限制下载速率:

QNetworkReply *MyNetworkAccessManager::createRequest(
                QNetworkAccessManager::Operation op,
                const QNetworkRequest &req,
                QIODevice *outgoingData)
{
    // original call to QNetworkAccessManager in order to get the reply
    QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData);

    // add this reply (which is a QIODevice*) to the rate controller
    rateController.addDevice(reply);

    return reply;
}

如果您已经知道实际执行请求的代码片段,则不必继承 QNetworkAccessManager。方法get()post()返回 aQNetworkReply*您也可以将其添加到速率控制器。(但是这样,您在管理器之外手动执行此操作,这不符合信息/实现隐藏的概念,在这种情况下,下载是速率控制的事实。)

于 2012-08-27T10:17:57.823 回答