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

时间:2012-08-27 10:11:37

标签: qt

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

1 个答案:

答案 0 :(得分: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()返回QNetworkReply*,您也可以将其添加到速率控制器中。 (但是这样,你手动在管理器外面执行,这不符合信息/实现隐藏的概念,在这种情况下,下载的事实是率控制的。)