|
Вопрос # 3 658/ вопрос открыт / |
|
Приветствую, уважаемые эксперты! Я использую простенький алгоритм :
procedure TForm1.btn1Click(Sender: TObject);
var
hInet, //<-переменная сод. указатель на сессию
hURL: HINTERNET; //<-указатель на URL
fSize, //<-размер файла
ReadLen, //<-количество реально прочитанных байт
RestartPos: DWORD; //<-|позиция с которой начинается
// |докачка
fBuf: array[1..1024] of byte; //<-буфер куда качаем
f: file; //<-файл куда качаем
Header: string; //<-|дополнительная переменная в HTTP
begin
.....
end;
Его можно найти везде! если набрать в поиске.
Так вот сам вопрос - Можно ли как-нибудь ограничить скорость скачки в данном примере?
Мои подозрения падают на это - fBuf: array[1..1024] of byte;
А именно, то что может быть изменить там размер буфера.
Подскажите пожалуйста или дайте наводку (сам люблю мозгами шевелить! Просто уже терпение лопнуло за весь день!)
Заранее Спасибо!
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 16 января 2010, 21:19
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Ну, конечно скорость зависит от размера буфера, но эта зависимость не столь значительная, чтобы ей пользоваться. Я бы вынес скачивание в отдельный Thread, а в цикле закачки регилировал скорость просто вставкой нужной задержки.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 января 2010, 10:00
Оценка за ответ: 5
Комментарий к оценке: Спасибоооооооооооо!!!! ОГРОМНООООООЕ! Действительно помогло -
fBuf: array[1..1024] of byte в этом месте изменил 1024 на 30 и теперь программа хреначит как барбос!
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 17 января 2010, 12:16; участников в обсуждении: 2.
|
eclipse (статус: Посетитель), 17 января 2010, 11:29 [#1]:
Ну допустим я, как Вы сказали, заторможу немного время Вот так :
procedure Delay(ms: longint);
procedure tform1.Delay(ms: longint);
var
TheTime: LongInt;
begin
TheTime := GetTickCount + ms;
while GetTickCount < TheTime do
Application.ProcessMessages;
end;
Тем самым не тормозя форму(чтоб она не висла), но от этого же будет только такой эффект что она сперва качает качает, потом стоит, а потом опять со всей мощью начинает качать и т.д. Т.е. получается что мы просто поставим интервал скачки а не ограничение по скорости! Так? Или я не правильно рассуждаю?
|
|
eclipse (статус: Посетитель), 17 января 2010, 11:45 [#2]:
Мне кажется что значения буфера нужно подбирать под свою скорость интернета. Вот например у меня провайдер даёт от 30 до 40 кб в сек. , поэтому уменьшение буфера увеличило производительность! Ежли не так то поправьте.
|
|
min@y™ (статус: Доктор наук), 17 января 2010, 11:48 [#3]:
А какая разница? Главное, чтобы прога занимала не всё время канала, а часть. Чем больше интервалы задержки, тем меньше средняя скорость закачки.
А вот в основном потоке так делать не стоит:
while GetTickCount < TheTime do
Application.ProcessMessages; // <-- Загрузка CPU = 100%
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 17 января 2010, 11:50 [#4]:
Цитата (eclipse):
Мне кажется что значения буфера нужно подбирать под свою скорость интернета.
Верно мыслишь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 17 января 2010, 11:52 [#5]:
Хм.... т.е. нужно организовать отдельный поток!
|
|
min@y™ (статус: Доктор наук), 17 января 2010, 12:00 [#6]:
Цитата (eclipse):
Хм.... т.е. нужно организовать отдельный поток!
Дык я в ответе так и написал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 17 января 2010, 12:16 [#7]:
Ага! так я и подтвердил это.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|