Can we restrict QNetworkAccessManager
from consuming whole bandwidth, by restricting the download speed, as we do see such options available with almost every download manager?
1 に答える
これはそのままでは不可能です。しかし、Qt Torrent Example、特にクラスRateController
( ratecontroller.h | ratecontroller.cpp ) を見てください。このクラスは、1 つだけでなく一連の接続を制御することで、ほとんどのことを行います。
ただし、このレート コントローラーは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*
、レート コントローラーに追加することもできます。(しかし、この方法では、マネージャーの外で手動でこれを行います。これは、情報/実装の隠蔽の概念を満たしていません。この場合、ダウンロードはレート制御されているという事実です。)