У меня есть приложение, состоящее из двух окон, одно из которых связывается с другим и отправляет ему структуру, содержащую два целых числа (в данном случае два броска кубика).
Я буду использовать события для следующих обстоятельств:
- Процесс a отправляет данные процессу b, процесс b отображает данные
- Процесс a закрывается, в свою очередь процесс закрытия b
- Процесс b закрывает a, в свою очередь закрывает процесс a
Я заметил, что если второй процесс постоянно ожидает, пока первый процесс отправит данные, тогда программа просто будет сидеть в ожидании, и именно здесь возникла идея реализации потоков для каждого процесса, и я уже начал реализовывать это уже .
Проблема, с которой я столкнулся, заключается в том, что у меня нет особого опыта работы с потоками и событиями, поэтому я не уверен, что лучше всего реализовать то, что я хочу сделать.
Я пытаюсь понять, как другой процесс узнает о событии, которое запускается, чтобы он мог выполнять задачи, которые ему нужны, я не понимаю, как один процесс, отдельный от другого, может сказать, в каких состояниях события, в частности, должны действовать, как только событие изменило состояние.
Спасибо за любую помощь
Edit:
Я могу использовать только методы Create / Set / Open для событий, извините, что не упомянул об этом раньше.
Кроме того , я создаю новый поток в процессе A, который позволяет пользователю взаимодействовать с приложением во время прослушивания события close.
Создать тему:
hCreateEventThread = CreateThread(
NULL, // lpThreadAttributes (default)
0, // dwStackSize (default)
ThreadFunc, // lpStartAddress
NULL, // lpParameter
0, // dwCreationFlags
&hCreateEventThreadID // lpThreadId (returned by function)
);
if(hCreateEventThread != NULL)
{
MessageBox(hMainWindow,L"Thread created!",L"Success!",MB_OK);
}
Открытие события A при закрытии B :
DWORD WINAPI ThreadFunc(LPVOID passedHandle)
{
hConsumerCloseEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ConsumerCloseEvent"));
while(TRUE)
{
dwCloseResult = WaitForSingleObject(hConsumerCloseEvent,INFINITE);
switch (dwCloseResult)
{
// State of object is signalled
case WAIT_OBJECT_0:
//Consumer has closed, exit program.
//CloseHandle(hDiceRoll);
//CloseHandle(hCloseEvent);
//CloseHandle(hCreateEventThread);
ExitProcess(1);
break;
default:
return;
}
}
}
Создание события в b (в WM_CREATE):
hConsumerCloseEvent = CreateEvent(
NULL, // default security attributes
TRUE, // manual-reset event
TRUE, // initial state is nonsignaled
TEXT("Global\\ConsumerCloseEvent") // object name
);
if(hConsumerCloseEvent == NULL)
{
MessageBox(hMainWindow,L"CreateEvent failed",L"Error",MB_OK);
}
Установка события, сигнализируемого при закрытии B:
case WM_DESTROY:
{
SetEvent(hConsumerCloseEvent);
PostQuitMessage(0);
break;
}
Как видно из сообщения о событии, приложение A закрывается. Когда я запускаю приложение и закрываю процесс B, процесс A не замечает измененный сигнал и не закрывается.
Редактировать 2:
После использования GetLastError (); Мне удалось идентифицировать, что дескриптор OpenEvent был НЕДЕЙСТВИТЕЛЕН, выданная ошибка
ERROR_FILE_NOT_FOUND - 2: система
не могу найти указанный файл
Является ли мой метод создания события и его чтения некорректным, я обязательно включил префикс Global \.