Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 4
Всего онлайн: 4
Зарегистрировано юзеров: 5977
Комментариев на сайте: 630
Новый юзер: deenama2



Последние комментарии
c
Theihpled прокомментировал "Урок 62 - Методы, наследование классов, операции с классами Delphi, (часть 4/6)":
Здравствуйте, Савельев Александр. У меня к вм небольшой вопрос по языку https://cloud.mail.ru/public/KFS1/dYUrFbaTU . Cпасибо за уроки.
Theihpled прокомментировал "Урок 54 - Потоки в Delphi, (часть 2/3)":
Кстати да. С потоками тоже ничего не вышло.



Мы в соцсетях
c
Delphi
Урок 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 мин




После


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

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


Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 24 Июня 2013
Просмотров: 9257

Урок 54 - Потоки в Delphi, (часть 2/3) Урок 56 - Создание собственных процедур и функций Delphi, (часть 1/3)

Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.



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