Урок 55 - Потоки в Delphi, (часть 2/3)

  В этом уроке мы научимся скачивать файл из интернета в потоке.
  Сделаем на основе полученных знаний о потоках из предыдущих уроков небольшой пример, мы будем скачивать файл из интернета размером 50 мб.
   Создадим новый проект, и вытащим компоненты: Button, Label, Timer, IdHTTP (Indy) и ProgressBar, сначала сделаем без потока, а потом с ним. Разметим эти компоненты так как на картинке:

Внешний вид


   Скачивать файл мы будем по нажатию на кнопку, но чтобы информировать нас о том зависла ли программа, нам понадобятся таймер и label. Создадим у таймера обработчик OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
	Label1.Caption:= IntToStr(StrToInt(Label1.Caption) + 1); //Увеличиваем на 1 число
end;
   Если программа не зависла то число в label будет увеличивается, ибо нет.
   Разберёмся с ProgressBar'ом, он нам нужен для отображения прогресса скачивания. Создадим 2 обработчика: OnWorkOnWorkBegin, в первом:
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
	ProgressBar1.Position:= AWorkCount; //Кол-во скаченых байтов
end;
   Во втором:
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
	ProgressBar1.Max:= AWorkCountMax; //Макс. кол-во байтов в файле
end;
   Ну а теперь самое главное, процедура скачивания. В обработчике OnClick на кнопке:
procedure Button1Click(Sender: TObject);
var
	Stream: TMemoryStream; //Буфер для хранения файла
begin
	Stream:= TMemoryStream.Create; // Создаем буфер
	Form1.IdHTTP1.Get('Адрес до файла', Stream); // Скачиваем
	Stream.Free; // Очищяем буфер
end;
   Можно пробовать, компилируем и запускаем.

До




Через 1 мин




После


   Как видите числе замерло во время скачивания. Основной поток был занят файлом и не обращал внимания на компоненты. Даже переместить программу за заголовок нельзя.

   Теперь сделаем это в потоке, создадим поток с помощью мастера, имя зададим TDownload, вот появился отдельный юнит с готовым шаблоном потока, нам надо переместить код на кнопке в процедуру Execute в потоке:
procedure TDownload.Execute;
var
	Stream: TMemoryStream; //Буфер для хранения файла
begin
	Stream:= TMemoryStream.Create; // Создаем буфер
	Form1.IdHTTP1.Get('Адрес до файла', Stream); // Скачиваем
	Stream.Free; // Очищяем буфер
end;
   Также присоединим Unit1 к потоку:
implementation // после этого слова

uses unit1; // добавим unit1 в юните потока
   также и к Unit1 присоединим поток, добавим в стандартную секцию Uses Unit2 и создадим глобальную переменную Download: TDownload, в обработчике события на кнопке:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Download:= TDownload.Create(False); //Создаем поток и сразу запускам
end;


До




Через 1 мин




После


   Программа не виснет, а виснет новый поток. Ну вот и все.

Удачи!
Встретимся в следующем уроке!




Добавил(а): Xameleon Дата: 2014-04-30
Stream:= TMemoryStream.Create; Form1.IdHTTP1.Get(Edit1.Text, Stream); Stream.Free; Можно и так сделать, по-моему


    No results found.
Отменить.