Урок 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;Можно пробовать, компилируем и запускаем.
Как видите числе замерло во время скачивания. Основной поток был занят файлом и не обращал внимания на компоненты. Даже переместить программу за заголовок нельзя.
Теперь сделаем это в потоке, создадим поток с помощью мастера, имя зададим 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;
Программа не виснет, а виснет новый поток. Ну вот и все.
Удачи!
Встретимся в следующем уроке!
Добавил(а): Xameleon | Дата: 2014-04-30 | |
Stream:= TMemoryStream.Create;
Form1.IdHTTP1.Get(Edit1.Text, Stream);
Stream.Free;
Можно и так сделать, по-моему
|
No results found.