Реферат: Робота з "потоками" в середовищі Delphi
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) подібний взаємному виключенню. Різниця між ними у тому, що семафор може управляти кількістю потоків, які мають до нього доступ. Семафор встановлюється на граничне число потоків, яким доступ дозволений. Коли це число досягнуте, подальші потоки будуть припинені, поки один або більш потоків не від'єднаються від семафора і не звільнять доступ.
Як приклад використовування семафора розглянемо випадок, коли кожний з групи потоків працює з фрагментом спільно використовуваного пулу пам'яті. Оскільки спільно використовувана пам'ять допускає звернення до неї тільки певного числа потоків, всі інші повинні бути блоковані аж до моменту, коли один або декілька користувачів пулу відмовляться від його сумісного використовування.