Объект типа "событие" — простейший выбор для задач синхронизации. Он подобен дверному звонку — звенит до тех пор, пока его кнопка находится в нажатом состоянии, извещая об этом факте окружающих. Аналогично, и объект может находиться в двух состояниях, а "слышать" его могут многие потоки сразу. Событие может находиться в двух состояниях - активном (сигнализирущее состояние) и сброшенном (несигнализирующее состояние). В активное состояние событие переводится методом SetEvent, а сбрасывается методом ResetEvent. Событие может быть внутренним объектом потока, а может не принадлежать никакому потоку конкретно. Поток может ожидать только данного события с помощью метода Wait, либо использовать его дескриптор Handle для альтернативного ожидания.
Событие - это объект, синхронизирующий о том, что произошло какое-то событие, в отличиии от мьютекса владельцем кот. может быть один процесс в конкретное время, события могут управлять синхронизацией нескольких процессов:
//P или W в ручном или автономном режиме произошла работа.
|
|
function CreateEvent(sa:Pointer; ManResetType:boolean; initSingn:boolean; EventName:pChar):Thandle; CloseHandle(handle); закрыть событие
Setevent(handle); установить событие.
ResetEvent(handle); сбросить событие
PulseEvent(handle);
WaitFor...(...);
Если работа с событиями происходит в автоматическом режиме после установки событий освобождается 1 из ожидающихся процессов; соб-е автоматически переустаавливается не в сигнализирующее состояние. В ручном режиме независимо от набора ожидюпроцессов событие остается в сигнализирующем состоянии.
При автоматическо перустановке возможна работа в пульсирующем режиме, в этом случае операция пульс: освобождается все ожидающие роцессы и событие переустанавливается...
Механизмы синхронизации Win32. Семафоры
Теже семафоры, только вместо счетчика — указатель на ячейку памяти, где он хранится.
//Создание семафоров
function CreateSemaphore(
sa: Pointer; // Начальнео значение семафора
initialcount: integer;
maximumCount: integer; //максимальное значение
SemaphoreName: pChar): Thandle;//Имя семафора
CloseHandle(handle);
Семафор если он открыт находится в синхрониз. Состоянии
waitFor(...);
//Открытие
ReleaseSemaphore(
handle, //дескриптор
count. // знач. На которое изменяется счетчик семафора
poldcount); //Указатель на ячейку которая будет помещен предыдущее значение S