Параметр bManualReset функции CreateEvent() позволяет создать событие,
сбрасываемое не вручную, а автоматически. Автоматически сбрасываемое со-
бытие переходит в несигнальное состояние сразу же после выполнения функции
SetEvent(). Для таких событий функция ResetEvent() является избыточной. Кро-
ме того, перед автоматическим сбросом по каждому сигналу событие освобож-
дает только один поток. Автоматически сбрасываемые события целесообразно
применять в таких программах, где один основной поток подготавливает дан-
ные для других, вспомогательных потоков. При готовности нового набора дан-
ных основной поток устанавливает событие, по которому освобождается один
вспомогательный поток. Остальные вспомогательные потоки продолжают ожи-
дать подготовки новых данных.
Наряду с выполнением операций установки и сброса события можно сге-
нерировать импульсное событие:
BOOL PulseEvent(hEvent);…
Импульсное событие включает сигнал на короткий промежуток времени.
Применение этой функции для события, сбрасываемого вручную, позволяет
оповестить о нем все ожидающие потоки, а затем сбросить событие. Вызов
функции для события, сбрасываемого автоматически, дает возможность опо-
вестить только один ожидающий поток. Если не было ни одного ожидающего
потока, то никакой другой поток не будет оповещен. С другой стороны, уста-
новка автоматического события позволит оставить сигнал включенным до тех
пор, пока не появится ожидающий его поток. После оповещения потока собы-
тие сбрасывается автоматически.
2.4.4. Совместное использование семафоров,
исключающих семафоров и событий
Семафоры, исключающие семафоры и события могут совместно использо-
ваться несколькими процессами, которые необязательно должны быть связаны
друг с другом. Путем совместного задействования синхронизирующих объектов
процессы могут координировать свои действия по аналогии с тем, как это делают
потоки. Существуют три механизма совместного использования. Первый – это на-
следование, при котором один процесс создает новый процесс, получающий копии
всех дескрипторов родительского процесса. Копируются только те дескрипторы,
которые при создании были помечены как доступные для наследования.
Два других метода сводятся к созданию второго дескриптора существую-
щего объекта с помощью вызова функций. Какая из функций будет вызвана,
зависит от имеющейся информации. При наличии дескрипторов как исходного
процесса, так и процесса назначения следует вызывать функцию DuplicateHan-
dle(), при наличии только имени объекта – одну из функций Openxxx. Две про-
граммы могут заранее определить имя совместно используемого объекта.
Кроме того, одна из программ способна передать другой это имя посредством
совместно используемой области памяти функций DDEML (DDE Management
33