Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.05.2015, 11:19
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию Скачивание файла в несколько потоков

Пытаюсь организовать загрузку файла (одного файла) в несколько потоков, как, например, в Free Download Manager. Поиски в инете привели к следующему результату:
Код:
type
    TDLoad = class(TThread)
    private
     Strim: TMemoryStream;
     {вариант:  Strim: TFileStream; - тут пока не ясно}
     URL: String;
     S, E: Cardinal; //Начальный и конечный байт для скачивания
    protected
     procedure Execute; override;
    public
    end;

{ TDLoad }

procedure TDLoad.Execute;
var h: TIdHTTP;
     Strim: TMemoryStream;
begin
 inherited Execute;
 h:=TIdHTTP.Create(nil);
 h.HandleRedirects:=True; //задаем
 h.Request.UserAgent:=    //нужные 
 h.Request.Referer:=        //параметры запроса
 h.OnWork:=              //здесь можно визуализировать  
 h.OnWorkBegin:=       //процесс с помощью ProgressBar
 h.Request.ContentRangeStart:= S; //откуда начинаем закачивать
 h.Request.ContentRangeEnd:= E;   //где заканчиваем
 Strim:= TMemoryStream.Create; //либо это нужно делать далее, в цикле
                                               //и передавать потоку уже созданный TMemoryStream
  ............................
 try
  h.Get(URL,Strim); //если все удачно, то в Strim мы имеем кусок нужного файла
 Except
  on E : Exception do
  ShowMessage('Нету'+#13#10+IntToStr(h.ResponseCode));
 end;
 h.Free;
end;
Дальше более или менее ясно:
запрашиваем размер, делим на части,
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Byte;
    dl: TDLoad;
    ms: TMemoryStream //Как вариант  
begin
 .................................
 for i:= 0 to {кол-во частей} do
 begin
  ..................................
  ms:= TMemoryStream.Create;//вариан
  dl:= TDLoad.Create(True); 
  dl.S:= //задаем начало 
  dl.E:= //и конец части
  dl.Strim:= ms;
 end;
  ...................................
       //теперь нужно отловить завершение всех dl: TDLoad
       //и собрать все потоки в один файл очевидно понадобится TFileStream
end;
отловить завершение всех потоков я, вероятно, еще сумею, хотя и здесь не откажусь от помощи
а вот как собрать части в один файл не ясно
или есть какая то возможность записывать части сразу в FileStream?
Ответить с цитированием
 


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:11.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025