是否可以使用QNetworkAccessManager控制下载速度



我们可以通过限制下载速度来限制QNetworkAccessManager消耗整个带宽,因为我们确实看到几乎每个下载管理器都提供此类选项?

这不可能开箱即用。但是看看Qt Torrent的例子,特别是类RateController(ratecontroller.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()返回一个QNetworkReply*,您也可以将其添加到费率控制器中。(但这样,您可以在管理器外部手动执行此操作,这不符合信息/实现隐藏的概念,在这种情况下,下载是速率控制的。

最新更新