У вас гонка на мьютексе.Вы надеетесь на следующую последовательность:
child: create mutex
parent: open mutex
child: destroy mutex
Но что может случиться так:
child: create mutex
child: destroy mutex
parent: open mutex (fails because mutex is destroyed)
Я не могу понять, какова ваша конечная цель, но у меня естьПодозрение, что событие на самом деле то, что вы ищете.
В родительском:
- Создайте именованное событие.
- Установите событие как не сигнализированное.
- Создайте дочерний процесс.
- Подождите, пока событие не будет сообщено.
В дочернем процессе:
- Выполните некоторую обработку.
- Откройте именованное событие.
- Установите событие как сигнальное, освобождая родительский элемент от его ожидания.
На очень высоком уровне код, который вам нужен, будет выглядетькак это:
Родительский
Event = CreateEvent(nil, True, False, EventName);
//create it manual reset, set to non-signaled
ShellExecEx(....);
WaitForSingleObject(Event);
Ребенок
Event = CreateEvent(nil, True, False, EventName);
//do stuff
SetEvent(Event);
Я не включал проверку ошибок.Я уверен, что вы можете добавить немного.Вы также можете обнаружить, что класс-оболочка событий в SyncObjs
более удобен.
Наконец, ваш код имеет занятый цикл.Это почти никогда не является решением любой проблемы.Если вы когда-нибудь пишете занятый цикл, вы должны воспринимать это как сигнал о том, что дизайн неправильный.Дело в том, что в вашем коде, если бы он мог работать, родительский процесс сожжет 100% загрузку ЦП, ожидая дочерний процесс.