К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

5. События

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

В операционных системах Windows события описываются объектами ядра Events. При этом различают два типа событий:
- события с ручным сбросом;
- события с автоматическим сбросом.

Различие между этими типами событий заключается в том, что событие с ручным сбросом можно перевести в несигнальное состояние только посредством вызова функции ResetEvent, а событие с автоматическим сбросом переходит в несигнальное состояние как при помощи функции ResetEvent, так и при помощи функции ожидания. При этом отметим, что если события с автоматическим сбросом ждут несколько потоков, используя функцию WaitForSingleObject, то из состояния ожидания освобождается только один из этих потоков.

Создаются события вызовом функции CreateEvent, которая имеет следующий прототип:
HANDLE CreateEvent (
   LPSECURITY_ATTRIBUTES IpSecurityAttributes, // атрибуты защиты
   BOOL bManualReset, // тип события
   BOOL blnitialState, // начальное состояние события
   LPCTSTR lpName // имя события
);

Как и обычно, пока значение параметра lpsecurityAttributes будем устанавливать в null. Основную смысловую нагрузку в этой функции несут второй и третий параметры. Если значение параметра bManualReset равно true, то создается событие с ручным сбросом, в противном случае — с автоматическим сбросом. Если значение параметра binitiaistate равно true, то начальное состояние события является сигнальным, в противном случае — несигнальным. Параметр lpName задает имя события, которое позволяет обращаться к нему из потоков, выполняющихся в разных процессах. Этот параметр может быть равен null, тогда создается безымянное событие.

В случае удачного завершения функция CreateEvent возвращает дескриптор события, а в случае неудачи — значение null. Если событие с заданным именем уже существует, то функция CreateEvent возвращает дескриптор этого события, а функция GetLastError, вызванная после функции
CreateEvent, вернет значение error_already_exists.

Для перевода любого события в сигнальное состояние используется функция SetEvent, которая имеет следующий прототип:
BOOL SetEvent (
  HANDLE hEvent   // дескриптор события
);

При успешном завершении эта функция возвращает ненулевое значение, а в случае неудачи — FALSE.

 

 


Предыдущая        В начало страницы       Следующая
5