2012-11-03 4 views
5

Ich habe eine Probe zu prüfen, was passiert, wenn Sie Strg + C in Windows-Konsolenanwendung gedrückt wird:warum in c erste chace Ausnahme bekommen ++

bool TerminationFlag=true; 

int main() 
{ 
    g_hTerminateEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL); 
    ::SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 
    while(1) 
    { 
     if(TerminationFlag == false) 
     { 
      break; 
     } 
    } 
    return 0; 
} 

BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType) 
{ 

    if (dwCtrlType == CTRL_C_EVENT || 
     dwCtrlType == CTRL_BREAK_EVENT || 
     dwCtrlType == CTRL_CLOSE_EVENT) 
    { 
     TerminationFlag=false; 
     ::SetEvent(g_hTerminateEvent); 
     return TRUE; 
    } 
    return FALSE; 
} 

ich den Code getestet, indem es läuft in der visuellen Debugging-Option starten Studio, wenn ich ctrl + c drücken erhalte ich die folgende Meldung

Erste-Chance-Ausnahme bei 0x7c87647d

wenn Ich drücke auf continue Option mein Code kommt zu der Zeile TerminationFlag=false;, obwohl ich Strg + C im Steuerelement Handler behandelt habe. Kannst du mir bitte sagen, was das Problem ist?

+0

Wenn die erste Chance Ausnahme auftritt, schauen Sie sich die Ausnahme Datensatz, um zu sehen, was ausgelöst wird und warum. –

+0

@RaymondChen Wie sieht man Ausnahmerekord Sir? – Dany

+0

Der Ausnahmedatensatz ist Teil des EXCEPTION_POINTERS, das an den Ausnahmebehandler übergeben wird. Einige Debugger haben einen speziellen Befehl, um den aktuellen Ausnahmedatensatz anzuzeigen. (Zum Beispiel verwendet windbg '.ecxr'.) –

Antwort

11

Ich nehme an, dass Sie Microsoft Visual Studio aus Ihrer Beschreibung des Problems verwenden. Die erste Möglichkeit, die ausgelöst wird, ist das CTRL-C-Ereignis, das von der Debugging-Umgebung abgefangen wird. Dies ist das erwartete Verhalten.

Sie können wählen, dies zu ignorieren: gehen Sie zu Debug-Menü/Exceptions/Win32 Exceptions und nehmen Sie den CONTROL-C-Check aus dem "Thrown" -Spaltenmenü. Dies stellt sicher, dass der Debugger nur bei CONTROL-C bricht, wenn er nicht vom Benutzer behandelt wird. Siehe Bild unten:

enter image description here

übrigens sollten Sie für das Beendigungsereignis nicht Abruf für einen Flag warten. Sie möchten vielleicht etwas wie:

+0

Ich habe versucht, was Sie sagten, aber immer noch bekomme ich die Ausnahme "First-Chance-Ausnahme bei 0x7c87647d in smallsample.exe: 0x40010005: Control-C."auf pressinf ctrl + c – Dany

+0

Hallo Dany, überprüfen Sie das Bild in dem Beispiel - stellen Sie sicher, dass Sie Ihre ausführbare Datei nach dem Löschen Flag 40001005 (Ctrl-C) neu erstellen. Überprüfen Sie Ihre Einstellungen. – Anthill

+0

Ich glaube, ich verstehe die Quelle Ihrer Verwirrung: STRG -C ist ein Interrupt und Visual Studio generiert aus praktischen Gründen einen DBG_CONTROL_C im Debug-Modus.Ctrl-C ist keine Ausnahme, was gemeldet wird, ist die Ausnahme DBG_CONTROL_C, die vom Debug-Modus generiert wird. – Anthill

1

Wenn Sie so etwas im Debugger ausführen, erhalten Sie nie das gleiche Bild, als wenn Sie es ohne Debugger ausführen würden. Im Debugger können Sie normalerweise keine Systemfunktionen überspringen, die die Konsoleneingabe/-ausgabe ermöglichen. Der Debugger wird hier unvermeidlich mit dem System interagieren.

Der zuverlässigste Weg, hier weiterzumachen, ist die Verfolgung.

Dies kann die Frage nicht direkt beantworten.

p.s. In Ihren Codebeispielen, wie sie jetzt sind, besteht keine Notwendigkeit für das Ereignis.

Update von MSDN:

Value Meaning 
0 CTRL_C_EVENT 

A CTRL + C-Signal empfangen wurde, entweder von Tastatureingaben oder von einem Signal, das von der GenerateConsoleCtrlEvent Funktion erzeugt.

+0

danke für die Antwort Sir, also was soll ich tun? – Dany

+0

Ich würde Ihnen empfehlen, print-Anweisung in Ihrem Handler zu setzen, der den Wert des empfangenen Parameters drucken soll. –

+0

sir ich bekomme einen Wert 0 in DWORD dwCtrlType, wenn ich pree ctrl + c – Dany