until Terminated;
e.Free;
end;
pro cedure 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). Критические секции подобны взаимным исключениям по сути, однако между ними существуют два главных отличия:

О взаимные исключения могут быть совместно использованы потоками в различных процессах, а критические секции - нет;

□ если критическая секция принадлежит другому потоку, ожидающий поток блокируется вплоть до освобождения критической секции. В отличие от этого, взаимное исключение разрешает продолжение по истечении тайм-аута.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Ноябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс