регулирование пропускной способности с помощью Qt - PullRequest
2 голосов
/ 08 апреля 2009

Я использую QNetworkAccessManager для загрузки файлов из Интернета, он предоставляет простой API для этой задачи. Но я хочу добавить ограничение скорости загрузки для класса, чтобы все ответы http не превышали этот предел (я не вижу причин для ограничения запросов).

Я гуглил abit и нашел интересный пост здесь . Но то, что он делает, это подкласс QTcpSocket и дает контроль над пропускной способностью, используя отдельный класс, который управляет набором сокетов. Хотя это хорошо, я хочу продолжить использование класса QNetworkAcessManager.

То, как я это вижу, я мог бы:

  1. создать подкласс QNetworkAccessManager и каким-то образом интегрировать подкласс QTcpSocket (это может включать создание подклассов еще большего количества классов, QHttp *).
  2. используйте классы, предложенные в статье, и создайте мой собственный QNetworkAccessManager вокруг них.
  3. QNetworkAccessManager позволяет использовать прокси. Я мог бы написать фальшивый прокси-класс, который будет иметь логику регулирования пропускной способности. Но мне это кажется уродливым хаком.

Хотя первые 2 варианта возможны, мне было интересно, есть ли более простой способ сделать это? Если нет, какой бы вы предложили?

Ответы [ 2 ]

1 голос
/ 15 апреля 2009

В итоге я использовал RcTcpSocket и RateController из этой статьи с классом QHttp. Перед выполнением запросов get / post с помощью QHttp я создаю RcTcpSocket, добавляю его в свой RateController и использую QHttp :: setSocket (QTcpSocket *). Я все еще не нашел решения, чтобы продолжать использовать QNetworkAccessManager, но это достаточно близко и работает очень хорошо.

0 голосов
/ 08 апреля 2009

Вы должны взглянуть на QNetworkReply :: setReadBufferSize (размер qint64). Я цитирую документ:

QNetworkReply будет пытаться остановить чтение из сети после заполнения этого буфера (т. Е. BytesAvailable () возвращает размер или более), в результате чего загрузка также замедляет . Если размер буфера не ограничен, QNetworkReply попытается загрузить его из сети как можно быстрее.

Полагаю, вы могли бы поиграть на этом значении, и, возможно, на значении, которое вы получаете из сигнала downloadProgress (), чтобы замедлить процесс. Я думаю, что должно быть довольно трудно получить что-то точное с этим, но это, вероятно, выполнимо.

...