Согласно документации MSDN для CreateEvent ,
Если функция завершается успешно, возвращаемое значение является дескриптором объекта события. Если именованный объект события существовал до вызова функции, функция возвращает дескриптор существующего объекта, а GetLastError возвращает ERROR_ALREADY_EXISTS.
Судя по вашему описанию, я не вижу проблем с тем, что вы делаете. Я ничего не вижу, чтобы указать, что вы делаете что-то неправильно. Для меня, однако, я обычно создаю событие один раз, используя CreateEvent (), а затем передаю дескриптор потоку (ам), о котором я хочу сигнализировать этим событием. Но в вашем подходе нет ничего технически неправильного.
Вы понимаете, что WaitForMultipleObjects () возвращает индекс первого сигнального дескриптора в массиве дескрипторов, верно? Например, если ваше именованное событие является вторым в списке, но первый дескриптор сигнализируется подавляющее большинство времени (например, быстродействующим потоком или событием ручного сброса, которое сигнализируется, но никогда не сбрасывается), WaitForMultipleObjects () всегда возвращает WAIT_OBJECT_0. Другими словами, ваш потребительский поток никогда не увидит тот факт, что ваше именованное событие сигнализируется, потому что первый дескриптор «всегда» сигнализируется. Если это так, поместите ваше именованное событие первым в списке.
Вы случайно не установили параметр bWaitAll для WaitForMultipleObjects () в TRUE, не так ли? Если вы это сделаете, то все дескрипторы в массиве дескрипторов были переданы до того, как функция вернется.
Кто вызывает ResetEvent () для вашего именованного события? Это должен быть потребитель. Это не случайно вызывается каким-то сторонним потоком, не так ли?
Это просто некоторые вещи, которые нужно перепроверить. Если событие все еще не ведет себя так, как вы ожидаете, замените WaitForMultipleObjects () на WaitForSingleObject (), чтобы проверить, правильно ли ваше именованное событие сигнализирует поток потребителя.
Надеюсь, это поможет.