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 a

Ich 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage