Delphi Studio » Delphi Статьи » Многопоточность в Delphi


Чаще всего, юзер начинает изучать потоки, когда задает вопрос: "Как сделать, чтобы форма не зависала?". И ему сразу же отвечают: "Многопоточность".
В этой статье я хочу рассказать читателю о потоках в дельфи и научить его создавать многопоточные приложения.
Как написать многопоточное приложение в Delphi? - очень просто, и я постараюсь вам это продемонстрировать. Но для начала немного теории.
Для начала давайте разберемся, что такое поток.
Поток - объект внутри процесса, отвечающий за выполнение кода и получающий для этого процессорное время. Каждая программа представляет собой главный поток и несколько вспомогательных(причем вспомогательных может и не быть). При запуске программы создается поток для ее выполнения, и если приложение однопоточное, то весь код будет выполняться последовательно, учитывая все условные и безусловные переходы. И тут то и возникают проблемы(см. пример). Если в программе есть какие-либо длительные действия, то во время их выполнения мы будем наблюдать зависшую форму. Но решение есть, нужно создать еще один поток, который будет выполнятся параллельно с главным, т.е форма будет выполнятся в одном потоке(главном), а нужный код в другом(вспомогательном).
Вот пример с тем же IdHTTP(Indy), когда многопоточность почти необходима:
IdHTTP1.Get('xxx.ru'); // При выполнении этого кода можно заметить, что форма зависает.
Многопоточность в Delphi обеспечивает почти параллельную(или по научному псевдопараллельно) работу множества программ. На самом деле настоящая параллельность возможна только на многопроцессорной машине. Но Windows, может имитировать такую работу.
В Delphi работа с потоками реализуется с помощью класса TThread. Чтобы его использовать, достаточно унаследовать свой класс от него, и переопределить метод Execute.
Думаю теории достаточно, чтобы вы имели представление о потоках. Перейдем к самому вкусному :) - к практике.
Недавно постучали в асю, попросили объяснить работу с потоками и помочь написать небольшую программу. Суть ее была в следующем: "Получать исходные коды страниц из списка и сохранять их в файлы". Программа была написана, и она хороша тем, что на ее примере легко объяснить, как работать с потоками в Delphi.
На чтоже, приступим :))
Для работу с сетью я выбрал компонент IdHTTP из набора Indy(т.к многие с ним знакомы). Для хранения списка страниц будет использовать TStringList. Файлы с исходными кодами будем сохранять как name_of_site.txt.
Открываем дельфи, создаем новое приложение. Для начала опишем свой класс потока, добавляем этот код после блока Uses :
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure ThreadExit(Sender : TObject); // Код который будет выполнятся при завершении потока
procedure Execute; override;
public
constructor Create; overload;
end;
Рассмотрим для начала конструктор:
constructor TMyThread.Create;
begin
Create(True); // True означает, что после создания класса поток автоматически запущен не будет.
FreeOnTerminate := True; // Указываем, что после завершения своего кода поток завершится сам, т.е не нужно вызывать метод Terminate
OnTerminate := ThreadExit // При завершении вызывать процедуру ThreadExit
Priority := tpNormal; // Устанавливаем приоритет
Inc(alive); // Увеличиваем счетчик живых потоков(пригодится, когда потоков будет больше 1)
Resume; // Запускаем поток(т.е вызываем метот Execute)
end;
Далее ThreadExit:
begin
Dec(alive);
end;
Теперь процедуру Execute, в которой находится основной код потока.
procedure TMyThread.Execute;
begin
{ Тут будет основной код }
end;
С методами потока разобрались. Теперь, чтобы реализовать многопоточность, добавим к глобальным переменным :
MyThread : TMyThread;
alive : integer; // Счетчик живых потоков
codes : Integer; // Кол-во полученных исходников
SiteList : TStringList; // Список сайтов
Далее как и любой класс TMyThread нужно создать :
Список сайтов можно загрузить как из мемо, так и из текстового файла, с помощью метода LoadFromFile.
Теперь когда наш "шаблон" сделан, займемся основным кодом. Весь код потока будем описывать в процедуре Execute.
var
HTTP : TIdHTTP; // Важно создавать IdHTTP в потоке
cur_site : string; // УРЛ текущего сайта
Response : TStringList; // Исходный код страницы
begin
{ Создаем объекты }
Response := TStringList.Create;
HTTP := TIdHTTP.Create(nil);
HTTP.HandleRedirects := True;
{ Нам достаточно запустить один поток, в котором будет выполнятся след. цикл, а не запускать каждый раз новый, когда другой выполнит свой код }
while (codes < SiteList.Count)and(Terminated = False) do // Пока кол-во полученных исходников меньше количества сайтов, и поток не остановлен, делать:
begin
cur_site := SiteList[codes]; // Получаем урл
inc(codes); // Увеличиваем codes на 1
try
Response.Text := HTTP.Get(cur_site); // Тут делаем запрос
except
Continue;
end;
cur_site := StringReplace(cur_site, '.', '', [rfReplaceAll]); // Тут немного правим урл сайта, что бы можно было сохранить текстовик
Delete(cur_site, 1, 7);
Response.SaveToFile(cur_site + '.html'); // Сохраняем, можно в html, можно и в txt
end; // while
end;
Вот собственно и весь код :)) Все очень просто, не правда ли?
Теперь пара последних доработок :
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
begin
SiteList.Text := Memo1.Lines.Text; // Загружаем список сайтов
MyThread := TMyThread.Create; // Создаем поток
Button1.Caption := 'Working...'; // Для наглядности :)))
// Пока есть живой поток, выводим статистику
repeat
Label3.Caption := 'Alive: ' + IntToStr(alive);
Label4.Caption := 'Codes: ' + IntToStr(codes);
Application.ProcessMessages;
until alive = 0;
Button1.Caption := 'Finish';
Label3.Caption := 'Alive: ' + IntToStr(alive);
end;
Поэкспериментируйте с данным кодом. Сделайте чтобы юзер сам выбирал кол-во потоков. Реализовать это можно так:
Киньте на форму Edit. И измените свой код на:
MyThread : array of TMyThread;
............
SetLength(MyThread, StrToInt(Edit1.Text));
for i := 0 to StrToInt(Edit.1Text) - 1 do
MyThread[i] := TMyThread.Create;
Правда тогда возникнут новые проблемы. А именно - проблемы с синхронизацией потоков. Но это уже материал след. статьи.
Думаю теперь вы поняли, как создавать многопоточное приложение на Delphi.
При использовании статьи на сторонних ресурсах, ссылка на источник обязательна.


Delphin
Администратор
Рега: 12.04.2010
Постов: 132
Сообщений: 3858106


Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
Лучшее на Delphi Studio
Лучшие книги по Delphi
-
Книга Delphi 2010 Handbook with Source Code - Книга Delphi 2010 Handbook with Source Code посвящена CodeGear Delphi 2010
Книга Программирование в Delphi глазами хакера. Фленов - В книге вы найдете множество нестандартных приемов программирования на языке Delphi, его недокументированные функции и возможности. Вы узнаете, как создавать маленькие шуточные программы. Большая часть книги посвящена программированию сетей
Книга Delphi в шутку и всерьез что умеют хакеры М.Флёнов - Электронная книга о профессиональных приемах программирования в Delphi. В легкой и доступной форме с использованием большого количества профессиональных примеров рассмотрены вопросы корректного написания кода, оптимизации программ, работы с системным окружением, создания сетевых приложений
Книга Библия Delphi Михаил Фленов (2-е издание) + CD - Книга посвящена программированию на языке Delphi от самых основ до примеров построения конкретных приложений. Подробно описывается логика выполнения каждого участка кода, чтобы читатель смог использовать эти знания при решении собственных задач. Книга содержит большое количество примеров практического программирования
Книга О чем не пишут в книгах по Delphi + CD Григорьев А.Б - Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP
Книга Delphi 7 Учебный курс С.Бобровский - Электронная книга является руководством по программированию в среде Delplii 7. Описывается весь процесс разработки программы: от конструирования диалогового окна до организации справочной системы и создания установочного CD-ROM
Книга Delphi Быстрый Старт - В книге описываются интерфейс системы визуального программирования Delphi на основе 6-й версии, состав и характеристика элементов проекта приложения, приемы программирования на языке Object Pascal
Книга Indy in Depth. Глубины Indy - Книга Indy in Depth Глубины Indy будет интересно для тех, кто интересуется хакингом, вирусописанием, а значит и для тех, кто занимается защитой сетей, программ, информации. Эта книга не только по Indy, она про Интернет, про протоколы, термины, методы работы, а к Indy относятся только примеры
Книга OpenGL - Графика в проектах Delphi + CD. М.В.Краснов - Книга посвящена использованию стандартной графической библиотеки OpenGL в проектах Delphi. Начиная с самой минимальной программы, последовательно и подробно рассматриваются все основные принципы программирования компьютерной графики: двухмерные итрехмерные построения, анимация, работа с текстурой, визуальные эффекты
Книга Delphi 7 для профессионалов. Марко Кэнту - Книга, которую должен прочитать каждый, кто хочет стать профессиональным программистом на Delphi. Книга не предназначена для начинающих. Требуются хорошие знания Delphi. Предназначена для тех, кто хочет стать именно профессиональным программистом
- Delphi Studio Примеры на Delphi Примеры на Delphi [Сеть Интернет] Примеры на Delphi [Система] Примеры на Delphi [Графика Мультимедиа] Примеры на Delphi [Базы данных] Delphi Исходники Исходники Delphi [Сеть Интернет] Исходники Delphi [Система] Исходники Delphi [Графика Мультимедиа] Delphi Исходники [Базы данных] Компоненты Delphi Скачать Компоненты Delphi Скачать Delphi / Pascal Скачать Книги, Учебники Delphi Скачать Книги, Учебники Pascal Delphi Статьи Pascal Статьи Вопросы и ответы по Delphi Вопросы и ответы по Pascal Карта сайта Delphi Studio Канал RSS Delphi Studio
delphi компоненты для работы в трей
delphi свернуть в трей
Delphi вывести случайное число
обновить indy
права доступа к файлам delphi
скачать учебник delphi 7
как скопировать в tstringlist из memo
StringReplace delphi2010
delphi как нажать кнопку Button
Как добавить прграмму в Total Commander
delphi stringgrid нажатие на заголовок
как на delphi свернуть программу в трей
загрузить файл на ftp вудзрш
delphi компонент анимация gif
vcl, определить размер файла
delphi как проверить существует ли фаил
учебник delphi 2010
как скопировать первые 10 знаков string delphi
icq база данных исходник
скачать бесплатно исходники для delphi 7
создать twebbrowser программно
delphi bitblt jgbcfybt
архангельский delphi 7 скачать
форму панель задач Delphi
язык Delphe.net
открыть форму дельфи
программно перезагрузить
компонент CoolTrayIcon
delphi скачать картинку
Delphi считать случайную строку из файла
webbrowser delphi показать рисунок
opendialog delphi запуск файла
delphi текст в буфер обмена
функции на Delphi для компонента Timer
как поменять прозрачность окна delphi
отправка нажатием клавиши delphi
скочать игры PC бесплатно бес sms и регистраций
Сайт Delphi Studio рассчитан для начинающих, новичков, чайников, которые решили программировать на Delphi :)
Добавляйте свои примеры, исходники, компоненты, статьи и тогда на сайте будет много полезной информации, что поможет друг другу находить нужный материал.
Авторизация на mail.ru (IdHTTP) Пример на Delphi - Пример авторизации в Delphi на сайте mail.ru. Для авторизации на сайте mail.ru нужно кинуть на форму компонент IdHTTP
Книга Программирование в Delphi глазами хакера. Фленов - В книге вы найдете множество нестандартных приемов программирования на языке Delphi, его недокументированные функции и возможности. Вы узнаете, как создавать маленькие шуточные программы. Большая часть книги посвящена программированию сетей
Авторизация на сайте vkontakte.ru на сокетах (ClientSocket) Пример на Delphi - Пример авторизации на сайте vkontakte.ru на сокетах (Socket). На форму нужно добавить компонент ClientSocket, 2 Edit, Button
» Delphi 7
» Многопоточность в Delphi
» Авторизация вконтакте на IdHTTP(Indy)
» Капча. Отправка на antigate.com
» Скачать компонент AlphaControls для Delphi
» Скачать компонент NextGrid для Delphi
» Как склеить несколько картинок в одну на Delphi
» Использование WinSock в Delphi. Часть 1
» Программа для решения судоку
» Использование ProgressBar при работе c IdHTTP
» Как программно выключить монитор? Пример на Delphi
» Использование WinSock в Delphi. Часть 2
» Проблемы с русскими символами в Indy.
А знаете ли вы что такие известные программы как AIMP, Skype, QIP, QIP Infium, R&Q, The Bat!, FL Studio, Guitar Pro, Game Maker, Total Commander, PowerArchiver, Download Master написаны на Delphi? И это далеко не весь список программ чем может похвастаться продукция Borland Delphi!