2009-04-08 5 views
2

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

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

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

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

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

ответ

1

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

+0

Ссылка больше не используется. –

0

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

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

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

+0

По-видимому, вы не понимаете, почему «регулирование пропускной способности» выполняется. Необходимо уделить приоритетное внимание некоторым службам выше других и обеспечить функционирование всех служб (предотвращение голодания). Цитированная документация не помогает решить эту проблему. –

Смежные вопросы