Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Функция открытия существующего именованного объекта события

HANDLE OpenEvent(

IN DWORD dwDesiredAccess,

IN BOOL bInheritHandle,

IN LPCSTR lpName

);

Краткое описание:

Функция OpenEvent позволяет нескольким процессам открывать дескрипторы одного и того же объекта события. Функция завершается успешно, только если какой-то процесс уже создал событие с помощью функции CreateEvent.

Параметры и описание:

(1) dwDesiredAccess — определяет доступ потока к объекту. 3 основных варианта: EVENT_ALL_ACCESS (можно выполнять все действия по отношению к объекту события), EVENT_MODIFY_STATE (можно использовать только функции SetEvent, ResetEvent и PulseEvent), SYNCHRONIZE (можно использовать события функций ожидания).

(2) bInheritHandle — определяет наследование. TRUE — дочерние процессы наследуют дескриптор. FALSE — не наследуют.

(3) lpName — определяет имя события.

Возвращаемое значение.

Если функция завершилась успешно, она возвращает дескриптор объекта события, в противном случае — возвращает NULL.

Пример.

Поток 1 готовит данные для обработки вторичными потоками 2 и 3.

Поток 1

HANDLE E[2];

E[0] = CreateEvent(NULL, true, false, "MyEvent2");

E[1] = CreateEvent(NULL, true, false, "MyEvent3");

HANDLE H = CreateEvent(NULL, true, false, "MyEvent1");

// подготовка данных…

// считывание из файла…

// далее установка события MyEvent1:

SetEvent(H);

// ожидание событий MyEvent2 и MyEvent3

WaitForMultipleObjects(2, E, true, INFINITE);

ResetEvent(E[0]);

ResetEvent(E[1]);

ResetEvent(H);

// продолжение выполнения после остановки события

С помощью MyEvent1 поток 1 будет оповещать потоки 2 и 3 об окончании подготовки данных. События MyEvent2 и MyEvent3 будут использоваться для получения информации от потоков 2 и 3.

После завершения подготовки данных событие MyEvent1 переводится в сигнальное состояние, которое распознается потоками 2 и 3.

Затем вызывается функция WaitForMultipleObjects, обеспечивающая ожидание до тех пор, пока события MyEvent2 и MyEvent3 не окажутся в сигнальном состоянии. После этого работа потока 1 будет продолжена.

Перед продолжением работы необходимо сбросить все события в несигнальное состояние функцией ResetEvent. Такой сброс необходим, если приведенный код выполняется больше одного раза.

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

В потоке 2, который должен среагировать на событие MyEvent1, нужно выполнить операции над подготовленными данными и оповестить поток 1 о завершении своего выполнения через событие MyEvent2.

Поток 2

HANDLE H = CreateEvent(NULL, true, false, "MyEvent1");

WaitForSingleObject(H, INFINITE);

// начало обработки данных, подготовленных потоком 1.

// …

// сообщение об окончании обработки:

SetEvent(OpenEvent(EVENT_ALL_ACCESS,true,"MyEvent2"));

Код начинается с создания (открытия) дескриптора события MyEvent1 и ожидания того, когда это событие будет переведено первым потоком в сигнальное состояние.

После того, как это произойдет, начнется обработка полученных данных.

После этого функция OpenEvent откроет дескриптор события. Функция SetEvent переведет событие в сигнальное состояние.

В потоке 3 необходимо разместить аналогичный код, заменив событие MyEvent2 на MyEvent3.

Домашнее задание.

Узнать про дескриптор защиты.