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

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 2
Всего онлайн: 2
Зарегистрировано юзеров: 6358
Комментариев на сайте: 645
Новый юзер: Realtyvaday



Последние комментарии
c
Aqel прокомментировал "Урок 71 - Работа с сжатыми файлами":
GZip псевдоархив, на мой вопрос тоже не отвечают, как распаковать отдельные файлы/папки...
Pingitrus прокомментировал "Урок 71 - Работа с сжатыми файлами":
Есть еще кто нибудь живой на этом сайте, кто сможет помочь? Так то все работает, zip и rar распаковывает, но у меня есть файл dat который сжат GZip, почему то его не удается распаковать или так не получится так как этот файл не является архивом или является?)) пишет ошибку что неверная функция



Мы в соцсетях
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
Просмотров: 10353

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

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



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