So wird ein Ereignissignal über Prozesse gesendet - C
Ich habe eine Anwendung, die aus zwei Fenstern besteht, eines kommuniziert mit dem anderen und sendet ihm eine Struktur mit zwei ganzen Zahlen (in diesem Fall zwei Würfelwürfe).
Ich werde Ereignisse für die folgenden Umstände verwenden:
Prozess a sendet Daten an Prozess b, Prozess b zeigt Daten anProzess a wird geschlossen, Abschlussprozess bProzess b schließt a, der Abschlussprozess aIch habe bemerkt, dass, wenn der zweite Prozess ständig auf den ersten Prozess wartet, der Daten sendet, das Programm nur wartet. Dort ist die Idee entstanden, Threads für jeden Prozess zu implementieren, und ich habe bereits damit begonnen, dies zu implementieren.
Das Problem, das ich habe, ist, dass ich nicht gerade viel Erfahrung mit Threads und Ereignissen habe, daher bin ich mir nicht sicher, wie ich das, was ich tun möchte, am besten umsetzen kann.
Ich versuche herauszufinden, wie der andere Prozess von dem Ereignis erfährt, das ausgelöst wird, damit er die Aufgaben ausführen kann, die er ausführen muss. Ich verstehe nicht, wie ein Prozess, der von einem anderen Prozess getrennt ist, erkennen kann, in welchem Zustand sich die Ereignisse befinden sind in besonderem Maße, als es handeln muss, sobald sich der Zustand des Ereignisses geändert hat.
Danke für jede Hilfe
Bearbeiten
Ich kann die Create / Set / Open-Methode nur für Ereignisse verwende
Außerde, Ich erstelle in Prozess A einen neuen Thread, mit dem der Benutzer mit der Anwendung interagieren kann, während er auf das Abschlussereignis wartet.
Erstelle einen Thread
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);
}
Öffnungsereignis auf A, wenn B schließt:
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;
}
}
}
Ereignis in b erstellen (In 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);
}
Setzen des Ereignisses auf signalisiert, wenn B schließt:
case WM_DESTROY:
{
SetEvent(hConsumerCloseEvent);
PostQuitMessage(0);
break;
}
Wie Sie sehen können, wenn das Ereignis signalisiert wird, wird Anwendung A geschlossen. Wenn ich sowohl die Anwendung ausführe als auch Prozess B schließe, bemerkt Prozess A das geänderte Signal nicht und wird nicht geschlossen.
Edit 2:
Nach Verwendung von GetLastError (); Ich konnte feststellen, dass das Handle zum OpenEvent NULL war, der angegebene Fehler ist
ERROR_FILE_NOT_FOUND - 2: Das System kann die angegebene Datei nicht finden
Ist meine Methode zum Erstellen des Ereignisses und zum Lesen falsch, habe ich darauf geachtet, das Präfix "Global \" einzufügen.