Behandeln Sie STRG+C auf Win32

Habe ich einige Probleme mit der Handhabung von STRG+C - Ereignisse, die in einem Win32 C++ Konsole.

Grundsätzlich mein Programm sieht wie folgt aus: (basierend auf dieser anderen Frage: Windows Strg-C - Reinigung der lokale stack-Objekte in der Befehlszeile app)

bool running;

int main() {

    running = true;
    SetConsoleCtrlHandler((PHANDLER_ROUTINE) consoleHandler, TRUE);

    while (running) {
       //do work
       ...
    }

    //do cleanup
    ...

    return 0;
}

bool consoleHandler(int signal) {

    if (signal == CTRL_C_EVENT) {

        running = false;
    }
    return true;
}

Ist das problem der cleanup-code nicht ausgeführt überhaupt.

Nach der Ausführung der handler-Funktion in der Prozess beendet wird, aber ohne den code auszuführen, nachdem der main-loop. Was ist falsch?

EDIT: wie gewünscht, das ist ein minimaler Testfall ähnlich wie mein Programm: http://pastebin.com/6rLK6BU2

Habe ich nicht den "test-cleanup-Anweisung" Text in meiner Ausgabe.

Ich weiß nicht, ob das wichtig ist, ich kompiliere mit MinGW.


EDIT 2: Das problem mit den test-case-Programm ist die Verwendung der Sleep() Funktion. Ohne ihn funktioniert das Programm wie erwartet.

In Win32 die Funktion handler läuft in einem anderen thread, so dass, wenn der Hundeführer/thread beendet seine Ausführung, der Haupt-thread schlafen. Vermutlich ist dies die Ursache von Prozess-Unterbrechung?

Was bedeutet SetConsoleCtrlHandler zurück?
Sind Sie sicher, dass die ConsoleHandler Funktion läuft? Wenn du das Programm im debugger und setzen Sie einen Haltepunkt, wird es halt am Haltepunkt?
Auch, sollten Sie BOOL für die retval, und DWORD für das argument der consoleHandler. Auch, FALSCH/WAHR, in...
Und Sie deklarieren Sie eine Funktion Prototyp des consoleHandler - Funktion vor dem Aufruf SetConsoleCtrlHandler?
Wie können Sie dann überprüfen, dass der code nach der Schleife nicht ausgeführt werden? Wenn Sie einen Haltepunkt in den code ein und führen Sie in einem debugger, wird es aufhören?

InformationsquelleAutor eang | 2013-08-17

Schreibe einen Kommentar