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

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 3
Всего онлайн: 3
Зарегистрировано юзеров: 6619
Комментариев на сайте: 650
Новый юзер: Dysonetn



Последние комментарии
c
dealrattKi прокомментировал "Урок 3 - Конструкция IF...THEN...ELSE":
Это действительно радует меня. --- Бесподобное сообщение скачать fifa, скачать фифа а также [url=http://15fifa.ru/novosti-fifa-15]fifa 15 последние новости[/url] скачать фифа
intatryadebra прокомментировал "Урок 53 - Потоки в Delphi, (часть 1/3)":
Revival RO is best free ro populair ragnarok online private server founded in 2017 2018. Revival pvp big free Ragnarok server is an online exciting free MMORPG called ragnarok online, it a fun server for MMORPG gamers in ASIA. This is a top 10 ragnarok online private server thats high on the list and top ranking with massive players online. We have many players from Asia like Malaysia, Indonesia, Philippines, Thailand, Singapore, China, Hong Kong All these players are here to play free private ragnarok online server and battle players all around the world. They want to collect the best items and gear to be strongest in War of Emperium, War of Emperium are guild wars in this free RO Server. You can play this game on android phone or tablet or pc client. Enjoy And have fun. ragnarok online server http://bit.ly/2tKyawS

Урок 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
Просмотров: 10859

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

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



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