Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2019, 16:07   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию скачивание файла тормозит и зависает

Здравствуйте.
Нужно скачать много маленьких файлов, попутно объединяя их в один большой файл.
Написал код: https://pastebin.com/f6JSMGCs
Это работает, но есть проблемы.
Во-первых: иногда скачивание просто застревает. Иногда на пару секунд, иногда на минуту и более, а иногда вообще навсегда. Если оно застряло и возобновлилось, то иногда теряется несколько килобайт или мегабайт. А иногда не теряется. Если скачать один файл несколько раз, то размер, зачастую, получается разный. По-этому, приходится скачивать один файл несколько раз, выбирать те, у которых одинаковый размер, потом сравнивать их хэш. Если хэш сошёлся хотя-бы у двух файлов - файл считается успешно скачанным. Разумеется, это делается пользователем (мной) вручную. А так как размер скачиваемых файлов находится в промежутке 7-14гб, то
выполнение этой процедуры каждый раз - довольно проблематично и ресурсозатратно. И времени уходит немерено.
Во-вторых: скорость скачивания упирается в ~3,7mb/s. Хотя интернет позволяет качать со скоростью ~6,5mb/s.
В-третьх: скорость может и не доходить до 3,7mb/s. Иногда она сильно колеблится 0,7mb/s, 2,0mb/s, 1,0mb/s, 0,2mb/s, 3,3mb/s и т.п. При этом, переключение в цикле с файла на файл происходит тоже сильно медленнее, чем когда оно стабильно качает на 3,7mb/s. Таким образом, один большой файл может качаться более четырёх часов.
Пытался использовать WinHTTP, но он вообще кривой.
Проблему с потерей данных удалось решить вот так:
Код:
      repeat
        if InternetQueryDataAvailable(hUrl,
                              lpdwNumberOfBytesAvailable, 0, 0) then
        begin
          if lpdwNumberOfBytesAvailable > 0 then
          begin
            ZeroMemory(@buf, SizeOf(buf));
            if InternetReadFile(hUrl, @buf, SizeOf(buf), b) then
            begin
              if b > 0 then
              begin
                transfered := transfered + b;
                Stream.WriteBuffer(buf, b);
                if lpdwNumberOfBytesAvailable > SizeOf(buf) then
                ErrorDataReadIncomplete := b < SizeOf(buf) else
                ErrorDataReadIncomplete := b < lpdwNumberOfBytesAvailable;
                if ErrorDataReadIncomplete then
                begin
                  if Assigned(OnError) then
                    OnError(Self, DOWNLOAD_ERROR_INCOMPLETE_READ, fURL);
                end else
                begin
                  if Assigned(OnWork) then
                  begin
                    inc(iter);
                    if iter >= fProgressUpdateInterval then
                    begin
                      OnWork(Self, transfered);
                      iter := 0;
                    end;
                  end;
                end;
              end else
              begin
                ErrorDataReadIncomplete := True;
                Break;
              end;
            end else
            begin
              if Assigned(OnError) then
                OnError(Self, DOWNLOAD_ERROR_INCOMPLETE_READ, fURL);
              Result := DOWNLOAD_ERROR_DATA_READ;
              Break;
            end;
          end;
        end else
        begin
          Result := DOWNLOAD_ERROR_UNKNOWN;
          Break;
        end;
      until (lpdwNumberOfBytesAvailable = 0) or (b = 0) or
            (ErrorDataReadIncomplete) or (fStop);
Теперь, если размер принятого меньше размера запрошенного - скачивание прерывается и выдается сообщение об ошибке.
А как исправить остальное?

Последний раз редактировалось BLACK_RAIN; 18.05.2019 в 16:14.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.05.2019, 09:25   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Почему пропала кнопка "редактировать"? Нашел опечатки, хотел поправить.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.05.2019, 09:41   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что 24ч. прошло.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.05.2019, 12:05   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Потому что 24ч. прошло.
Да? Раньше вроде не было так. Ну да ладно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.05.2019, 12:07   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

было
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачивание файла vaximan Помощь студентам 3 29.07.2014 21:53
Скачивание файла из интернета, не зная пути и имени файла. Скрипт Microsoft Office Excel 0 14.09.2013 22:14
Скачивание файла kuba1981 PHP 1 24.08.2013 14:26
Скачивание файла fezilk24 Работа с сетью в Delphi 16 07.02.2011 18:35
Скачивание файла Lemo Помощь студентам 16 28.07.2009 22:54