);
until Terminated; e. Free;
end;
procedure TSimpleThread. Showlnfo;
begin
ShowMessage (IntToStr (Integer (res)));
end;
На головній ФОРМІ розмістімо Дві кнопки - натіснення однієї з них запускає Потік, натіснення Другої актівізує подію:
procedure TForml. ButtonlClick (Sender: TObject);
begin
TSimpleThread. Create (False);
end;
procedure TForml. Button2Click (Sender: TObject);
begin
e. SetEvent;
end;
Натіснемо Першу кнопку. Результат (метод Showlnfo), что тоді з'явився на екрані, залежатіме від того, чи булу натиснута друга кнопка або закінчіліся відведені 10 секунд.
Події Використовують НЕ Тільки для роботи з потоками - деякі процедури операційної системи автоматично перемікаю ть їх. До числа
таких процедур відносяться відкладене (overlapped) введення/Висновок и події, пов'язані з комунікаційнімі портами.
взаємні віключення
Об'єкт типом взаємне віключення (mutex) дозволяє Тільки одному потоку поза Володіти ним. Если продовжуваті аналогії, то цею об'єкт можна порівняті з естафетному паличка.
Клас, что інкапсулює взаємне віключення, - TMutex - знаходится в Модулі IPCTHRD.PAS (приклад IPCDEMOS). Конструктор:
constructor Create (const Name: string);
задає имя створюваного об'єкту. Спочатку ВІН НЕ захи Нікому. (Але функція API createMutex, что віклікається в ньом, дозволяє Передат Створений об'єкт тому потоку, в якому це відбулося.) Далі метод
function Get (TimeOut: Integer): Boolean;
віробляє СПРОБА ПРОТЯГ Timeout мілісекунд заволодіті об'єктом (у цьом випадка результат Рівний True). Если об'єкт більш НЕ потрібен, слід віклікаті метод
function Release: Boolean;
Програміст может використовуват взаємне віключення, щоб унікнуті прочитування и записами Загальної пам'яті декількома потоками одночасно.
Семафор
Семафор (semaphore) подібний взаємному віключенню. Різніця между ними у тому, что семафор может управляти кількістю потоків, Які мают до нього доступ. Семафор встановлюється на Гранична кількість потоків, Яким доступ дозволень. Коли це число досягнутості, подальші потоки будуть пріпінені, поки один або більш потоків НЕ від'єднаються від семафора и НЕ звільнять доступ.
Як приклад вікорістовування семафора розглянемо випадок, коли Кожний з групи потоків працює з фрагментом спільно вікорістовуваного пулу пам'яті. Оскількі спільно вікорістовувана пам'ять допускає звернення до неї Тільки Певного числа потоків, ВСІ Інші повінні буті блоковані аж до моменту, коли один або декілька Користувачів пулу відмовляться від его сумісного вікорістовування.
Критична секція
Працюючий в Delphi, програміст может такоже використовуват об'єкт типом критична секція (critical section). Критичні секції подібні взаємнім віключенням по суті, протікання между ними існують Дві Головні Відмінності:
В· взаємні віключення могут буті спільно вікорістані потоками в різніх процесах, а Критичні секції - ні;
В· ЯКЩО критична секція захи Іншому потоку, чекаючій Потік блокується аж до Звільнення критичної секції. На відміну від цього, взаємне віключення дозволяє продовження после Закінчення тайм-ауту.
Критичні секції и взаємні віключення Дуже Схожі. На перший погляд, виграш від вікорістовування критичної секції вместо взаємного віключення НЕ очевидні. Критичні секції, протікання, більш ефектівні, чем взаємні віключення, оскількі Використовують менше системних ресурсів. Взаємні віключення могут буті встановлені на Певний Інтервал годині, после Закінчення Якого Виконання продовжується; критична секція всегда чекає стількі, Скільки нужно.
Візьмемо клас TCriticalSection (модуль SYNCOBJS.PAS). Логіка вікорістовування его проста - В«тримати и не пускатиВ». У багатопотоковому Додатках створюється и ініціалізується загальна для всіх потоків критична секція. Колі один з потоків досягає критично важлівої ділянки коду, ВІН намагається захопіті секцію викликом методу Enter:
MySection. Enter; try DoSomethingCritical;
finally
MySection. Leave;
end;
Колі Другие потоки доходять до оператора захоплення секції Enter и знаходять, что вона Вже захоплена, смороду пріпіняються аж до Звільнення секції дерло потоком Шляхом виклику методу Leave. Зверніть уваг, что виклик Leave поміщеній в конструкцію try .. finally - тут потрібна стовідсоткова Надійність. Критичні секції є Системним об'єктами и підлягають обов'язковому звільненню - втім, як и решта об'єктів, что розглядаються тут.
Процес. Породження Дочірнього процеса
Об'єкт типом процес (process) может буті використаних для того, щоб пріпініті Виконання потоку в тому випадка, ЯКЩО ВІН для свого продовження потребує Завершення процеса. З практичної...