Скачиваем файл из Интернет с помощью TIdHTTP+потоки

4 минуты на чтение
Давайте в этой статье поговорим, как можно скачть файл из сети Интернет с помощью TidHTTP да и еще так, чтобы при этом наша форма не зависала и можно было во время скачивания выполнять какие-то другие функции программы, например набирать текст в TMemo. Для этого как вы помните, а уже и знаете мы будем использовать потоки, да тут TAntiFreeze не обойтись, так как она не сильно нас спасает от зависания, можно сказать делает вид, что нас спасает. Про скачивание файлов из сети Интернет с использованием потоков я говорил в этой статье, а скачивание файлов из сети Интернет с помощью TidHTTP я рассказывал в этой статье. Нам предстоит сделать тоже самое, только с использованием потоков, ничего сложно потоки делать мы уже умеем, скачивать файл из Интернет мы уже умеем, остается самая малость соединить это все дело во единое и чтобы у нас получилась отличная программа. На форме у меня
  • TEdit
  • TidHTTP
  • TButton
  • TprogressBar
Вы спросить зачем TEdit, да затем, чтобы во время скачивания файла можно было понабирать в TEdit какой-нибудь текст и убедиться в том, что форма действительно не зависает.
Давайте для начала создадим наш поток. Для этого я в текущем модуле описал вот такой вот класс
type
 ThreadHTTP=class(TThread)
 private
  Stream:TMemoryStream;
  i:integer;
 public
  procedure Execute;override;
  procedure ShowResult;
end;

Не забываем, что Вы сможете сделать поток с помощью мастера, для этого выполняем команду File-New-Other вкладка New и в данной вкладке выбрать TThread Obejct. Далее в появившемся окне ввести имя потока и нажать на «Ок«. После чего не забудте подключить в Uses данные модули, соответсвенно в модуле потока — модуль главный подключить, а в главной модуле подключить модуль потока. Всмпомним, что процедура Execute - процедура, которая выполняет непосредственно действия потока и синхронизирует другие процедуры, например процедуры результата, в данном случае у нас это процедура ShowResult.

Далее ставим указатель в нашем классе на процедуру Execute и нажимаем комбинацию клавиш — Shift+Crtl+C. Далее я написал код в процедуре Execute и выглядит следующим образом

procedure ThreadHTTP.Execute;
var
 j:integer;
begin
  inherited;
   i:=0;
   j:=0;
   Stream:=TMemoryStream.Create;
   Form1.IdHTTP1.Get('https://devdelphi.ru/files/VK_APImodul.rar',Stream);
   Form1.ProgressBar1.Max:=Stream.Size;
   while j<=Stream.Size do
    begin
     inc(i);
     Synchronize(ShowResult);
     inc(j);
     Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
    end;
   Stream.SaveToFile('C:\1.rar');
   Stream.Free;
end;

Как видите я завел переменную i, которая считает сколько мы в текущий момент скачали байт файла, это популярна, чтобы знать как идет скачка.

Процедура ShowResult у меня выглядит следующим образом

procedure ThreadHTTP.ShowResult;
begin
   Form1.Caption:=IntToStr(i)+' kbs';
end;

То есть я просто на заголовке окна отображаю сколько мы скачали байт файла из сети Интернет, в данном случае с моего сайта. Перед этим в процедуре Execute я синхронизировал данный результат

Далее на событие OnClick TButton нам необходимо создать поток и запустить его, чтобы началась скачка, для этого я написал следующее

procedure TForm1.Button1Click(Sender: TObject);
var
 MyHTTP:ThreadHTTP;
begin
   ProgressBar1.Position:=0;
   MyHTTP:=ThreadHTTP.Create(False);
end;

Обнуляем наш TProgressBar и создаем наш поток, и сразу вызываем процедуру Execute.

Как видите ничего сложно нету, чем дальше, тем интереснее. Ну, что ждем следующих статьей по потокам.

Исходники статьи качаем тут

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Как и обещал статья о загрузки файла из Интернет с помощью модуля wininet. Как мы скачивали файл с помощью TidHTTP можно посмотреть тут. Довольно мощная библиотека и много можно что с ней делать, но пока что остановимся на загрузке файлов из сети интернет с по...
В этой статья я расскажу Вам о том, как можно скачать файл несколькими способами из сети Интернет. Первый способ применять не стоит, потому, что он сильно много забирает оперативной памяти, если качать большие файлы, если не большие файлы с помощью этого метод...
Ну вот наконец-то я созрел для написании статьи, где я хочу рассказать о том, как можно скачать файл из Интернет без зависания формы, то есть с использованием потоков. Сказать честно, сам в потоках давно разбираюсь так до конца и не разобрался, но маленькую пр...