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

标签 qt

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

最佳答案

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

但是,此速率 Controller 在 QTcpSockets 上运行(准确地说是在 PeerWireClients 上运行),因此您需要将“peer”的类型更改为 QIODevice,我希望这不是那么难,因为 PeerWireClient 继承自 QTcpSocket,后者本身继承自 QIODevice:

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

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

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

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*,您也可以将其添加到速率 Controller 中。 (但是通过这种方式,您手动在管理器的外部执行此操作,这不符合信息/实现隐藏的概念,在这种情况下,下载是速率控制。)

关于qt - 是否可以使用 QNetworkAccessManager 控制下载速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139999/

相关文章:

qt - QSortFilterProxyModel : retrieve the item or index of the original model

c++ - 如何防止在加载程序中重新创建页面?

c++ - Qt Creator 运行报错

c++ - 将缺少的扩展名附加到 QFileDialog 的结果

C++ 重新分配() : invalid pointer

qt - 如何将命令行参数传递给 QT 中已经打开的程序?

linux - 从 QTreeWidgetItem 继承类获取数据

c++ - Qt 多线程信号和槽行为的问题

qt - GridView : leftMargin and rightMargin properties do not work

c++ - 为什么我的角落小部件没有显示在 QTabWidget 中?