Как отправить сигнал о событии через процессы - C
У меня есть приложение, состоящее из двух окон, одно общается с другим и отправляет ему структуру, содержащую два целых числа (в этом случае два броска кубика).
Я буду использовать события для следующих обстоятельств:
Процесс a отправляет данные процессу b, процесс b отображает данныеПроцесс закрывается, в свою очередь закрывается процесс бПроцесс b закрывает a, в свою очередь закрывает процесс aЯ заметил, что если второй процесс постоянно ожидает, пока первый процесс отправит данные, тогда программа просто будет сидеть в ожидании, и именно здесь возникла идея реализации потоков в каждом процессе, и я уже начал реализовывать это.
У меня проблема в том, что у меня нет большого опыта работы с потоками и событиями, поэтому я не уверен, что лучше всего реализовать то, что я хочу сделать.
Я пытаюсь понять, как другой процесс узнает о событии, которое запускается, чтобы он мог выполнять задачи, которые ему нужны, я не понимаю, как один процесс, отдельный от другого, может сказать, в каком состоянии находятся события тем более, что нужно действовать, как только событие изменило состояние.
Спасибо за любую помощь
Редактировать:
Я могу использовать только методы 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);
}
Открытие события на А, когда Б закрывается:
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 был NULL, ошибка дана
ERROR_FILE_NOT_FOUND - 2: система не может найти указанный файл
Является ли мой метод создания события и чтения его неправильным, я обязательно включил префикс Global \.