События. Объект событие используются для уведомления одного или нескольких ожидающих потоков о наступлении какого-либо события

Объект событие используются для уведомления одного или нескольких ожидающих потоков о наступлении какого-либо события. Объекты события делятся на два типа: сбрасываемые вручную (manual event или manual-reset event) и автоматически сбрасываемые или единичные события (single event или auto-reset event). Тип события указывает программист при создании события с помощью вызова CreateEvent.

Сбрасываемые вручную события могут сигнализировать одновременно всем потокам, ожидающим наступления этого события, и переводятся в занятое состояние программно. Любой поток может установить (перевести в свободное состояние) это событие при помощи вызова функции SetEvent или сбросить (перевести в занятое состояние) при помощи вызова ResetEvent. Если событие установлено, то оно остается в этом состоянии сколь угодно долгое время, вне зависимости сколько потоков ожидают этого события.

Автоматически сбрасываемые события сбрасываются самостоятельно после освобождения одного из ожидающих потоков, тогда как другие ожидающие потоки продолжают ожидать перехода события в свободное состояние. Другими словами, если при помощи SetEvent устанавливается автоматически сбрасываемое событие (единичное), только один ожидающий поток будет оповещен об этом событии и, соответственно, сможет продолжить работу. После этого система автоматически сбросит событие. Если в момент установки не существует ни одного ожидающего потока, событие останется в свободном состоянии до тех пор, пока в системе не появится какой-либо ожидающий это событие поток.

Объекты-события обычно используют в том случае, когда какой-то поток выполняет инициализацию, а затем сигнализирует другому потоку, что тот может продолжить работу. Инициализирующий поток переводит объект «событие» в занятое состояние и приступает к своим операциям. Закончив, он сбрасывает событие в свободное состояние. Тогда другой поток, который ждал перехода события в свободное состояние, пробуждается и вновь становится планируемым.

Создается объект событие с помощью функции CreateEvent.

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);

Параметр bManualReset сообщает системе событие какого типа требуется создать: событие со сбросом вручную (TRUE) или с автосбросом (FALSE). Параметр bInitialState определяет начальное состояние события - свободное (TRUE) или занятое (FALSE).

При успешном выполнении функция вернет дескриптор созданного события. Если событие с таким именем уже создано, то будет возвращен дескриптор уже существующего события, а вызов GetLastError() вернет код ERROR_ALREADY_EXISTS. Функция вернет NULL, если объект события создать не удалось.

Потоки из других процессов могут получить доступ к уже созданному объекту «событие» следующими способами:

1) вызовом CreateEvent с тем же параметром lpName;

2) наследованием описателя;

3) применением функции DuplicateHandle;

4) вызовом функции OpenEvent с передачей в параметре lpName имени, совпадающего с указанным в аналогичном параметре функции CreateEvent.

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

BOOL SetEvent (HANDLE hEvent);

Функция ResetEvent сбрасывает событие (меняет на занятое состояние). Значение параметра и возвращаемое значение аналогичны предыдущей функции.

BOOL ResetEvent (HANDLE hEvent);

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: