Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Здравствуйте.
Нужно скачать много маленьких файлов, попутно объединяя их в один большой файл.
Написал код: 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 в 17:14.
BLACK_RAIN вне форума   Ответить с цитированием
Старый 20.05.2019, 10:25   #2
BLACK_RAIN
Участник клуба
 
Регистрация: 13.02.2012
Сообщений: 558
Репутация: 101
По умолчанию

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

icq: 512-765
skype: alexp.frl
По умолчанию

Потому что 24ч. прошло.
Alex11223 на форуме   Ответить с цитированием
Старый 20.05.2019, 13:05   #4
BLACK_RAIN
Участник клуба
 
Регистрация: 13.02.2012
Сообщений: 558
Репутация: 101
По умолчанию

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

icq: 512-765
skype: alexp.frl
По умолчанию

было
Alex11223 на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачивание файла 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 19:35
Скачивание файла Lemo Помощь студентам 16 28.07.2009 22:54


15:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru