Перші кроки з TThread в Delphi, Delphi, Програмування, статті

карих Микола, Майстри Delphi

Введення

Незалежно від того, хочемо ми цього чи ні, але прогрес рухається
далі, з’являються все нові технології, нові процесори, нові “висоти”
продуктивності. У зв’язку з цим, все частіше програмістам доводиться
розробляти програми, які використовують складні операції, в яких
важлива швидкість і які виконувалися б одночасно з іншими. Цьому
питання якраз і присвячена ця стаття – створення багатопоточних
додатків (з безліччю дочірніх процесів, які виконуються
одночасно).

Навіщо потрібен Thread

Отже, навіщо ж потрібен клас Thread і його нащадки? По-перше, цей
об’єкт дозволяє створювати як би кілька програм в одній
(Кілька процесів, або, потоків). По-друге, ці процеси
можуть виконуватися як по черзі, так і одночасно (як
запрограмує розробник). По-третє, з цих процесів
можна легко отримати доступ до всіх глобальних даних програми,
т.к. клас процесу є, по суті, просто частиною програми –
звичайним юнітом (unit). По-четверте, можна створити своїх власних
нащадків TThread і запустити відразу кілька примірників одного і
того ж створеного класу. По-п’яте, кожним процесом дуже легко
управляти – запускати, завершувати, припиняти, переривати,
встановлювати пріоритетність, і т.д.

Короткий опис класу TThread

Отже, розглянемо деякі властивості, методи і події класу TThread.
















Властивості Методи Події

FreeOnTerminate – Звільняти чи
пам’ять, виділену під екземпляр класу процесу, коли
цей процес завершується. Якщо True – При завершенні
процесу (або при виклику методу Terminate) Примірник
класу автоматично звільняється (аналогічно викликом методу
Free).
Тип: Boolean;

  Handle (ThreadID) – Дескриптор процесу.
Ця величина може бути використана для керування процесом
через функції WinAPI.
Тип: THandle;

  ReturnValue – Повертається
значення при завершенні процесу.
Тип: Integer;

  Priority – Пріоритет процесу.
Можливі значення цієї властивості ми розберемо трохи пізніше.
Тип: TThreadPriority;

  Suspended – Показує, в
якому стані знаходиться процес: True – Призупинено,
False – У нормальному.
Тип: Boolean;

  Terminated – Показує,
завершений чи процес. True – Завершено, False – Ні.
Тип: Boolean;


 

Create(CreateSuspended: Boolean)
створює екземпляр класу. Параметр CreateSuspended
вказує на те, чи потрібно створювати призупинену завдання
(True), Або запускати її відразу (False);

  Suspend – Призупиняє
виконання процесу;

  Resume – Продовжує
виконання процесу після Suspend;

  Terminate – Повністю
припиняє виконання процесу;

  WaitFor – Чекає завершення
процесу, повертаючи потім код його завершення (ReturnValue);

  Synchronize(Method: TThreadMethod)
– Синхронізує виконання методу процесу, дозволяючи йому
працювати паралельно з іншими процесами.


 

OnTerminate – Виникає, коли
процес знаходиться в стадії завершення.



Пріоритет процесу

Отже, що ж таке пріоритет? Пріоритет – це величина, яка визначає,
наскільки даний процес повинен виконуватися швидше в порівнянні з іншими.
Тобто, іншими словами, чим вище пріоритет процесу, тим більше часу
він відбирає у системи та інших, паралельно працюючих процесів. Далі
розберемо можливі значення властивості Priority класу TThread в порядку
зростання пріоритету:

Практика і приклади

Наведемо невеликий приклад того, як можна створити окремий процес:






Приклад 1. “Шаблон” для створення Thread-ів.



{Визначення класу TMyThread}
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

implementation

procedure TMyThread.Execute;
begin
{Якщо Ви хочете, щоб процедура DoWork виконувалася лише один раз – видаліть цикл while}
while not Terminated do
Synchronize(DoWork);
end;

procedure TMyThread.DoWork;
begin
{Тут можна вже виконувати ті завдання, які повинні бути виконані процесом}
end;


А тепер – чудовий приклад для вивчення Thread! У наступне прикладі
додаток створює два паралельно працюючих процесу. Один Thread
намагається встановити прапорець CheckBox1 в положення “включено” (Checked: = True),
а інший, пересмикуючи першого – в “вимкнено”.






Приклад 2. “Поєдинок” Thread-в :-).



{У форму Form1 потрібно помістити TCheckBox – CheckBox1
і одну кнопку TButton – Button1}

{Визначення класів двох Thread-в}
type
TMyThread1 = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

TMyThread2 = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

var Form1: TForm1;
T1 : TMyThread1;
T2 : TMyThread2;

implementation

procedure TMyThread1.Execute;
begin
{Поки процес не перервали, виконуємо DoWork}
while not Terminated do
Synchronize(DoWork);
end;

procedure TMyThread2.Execute;
begin
{Поки процес не перервали, виконуємо DoWork}
while not Terminated do
Synchronize(DoWork);
end;

procedure TMyThread1.DoWork;
begin
{Намагаємося перемогти другий процес :-)}
Form1.CheckBox1.Checked := True;
end;

procedure TMyThread2.DoWork;
begin
{Намагаємося перемогти перший процес :-)}
Form1.CheckBox1.Checked := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
{Якщо кнопка називається Stop …}
if Button1.Caption = ‘Stop’ then begin
{перериваємо обидва процеси}
T1.Terminate;
T2.Terminate;
{Змінюємо назва кнопки}
Button1.Caption := ‘Start’;
{Виходимо з процедури}
Exit;
end;
{Створюємо і відразу запускаємо два процеси}
T1 := TMyThread1.Create(False);
T2 := TMyThread2.Create(False);
{Тут можна поекспериментувати з пріоритетами:
T1.Priority := tpLowest;
T2.Priority := tpHighest;
}

{Перейменовуємо кнопку}
Button1.Caption := ‘Stop’;
end;


P.S. Відмінний приклад роботи з TThread можна знайти в підкаталозі
Demos \ Threads каталогу, куди Ви встановили Borland Delphi.

Епілог

У цій статті відображені основні сторони роботи з процесами (потоками)
Thread в Borland Delphi. Якщо у Вас є питання – скидайте їх мені на E-mail:
snick@mailru.com, А ще краще – пишіть
у конференції цього сайту (Delphi. Загальні питання), щоб і інші користувачі
змогли побачити Ваше питання і спробувати на нього відповісти!

  
Увага! Передрук даної
статті або її частини без узгодження з автором. Якщо ви хочете мати цю
статтю на своєму сайті або видати в друкованому вигляді, зв’яжіться з автором.
Автор статті:  Карих Микола

Стаття написана для сайту: Дельфі.Вокруг та навколо.

  

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*