3

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?

4

1 に答える 1

2

これはそのままでは不可能です。しかし、Qt Torrent Example、特にクラスRateController( ratecontroller.h | ratecontroller.cpp ) を見てください。このクラスは、1 つだけでなく一連の接続を制御することで、ほとんどのことを行います。

ただし、このレート コントローラーはQTcpSockets(正確には で) で動作しているため、 「ピアPeerWireClients」のタイプを に変更する必要があります。QIODevicePeerWireClientQTcpSocketQIODevice

 // 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*、レート コントローラーに追加することもできます。(しかし、この方法では、マネージャーの外で手動でこれを行います。これは、情報/実装の隠蔽の概念を満たしていません。この場合、ダウンロードはレート制御されているという事実です。)

于 2012-08-27T10:17:57.823 に答える