2012-11-03 64 views
5

我做了一個抽樣檢查時,在Windows控制檯應用程序按下Ctrl + C鍵發生什麼:爲什麼越來越第一蔡斯例外,在C++中

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; 
} 

我通過啓動視覺 調試選項運行它測試的代碼工作室當我按Ctrl + C我得到以下信息在0x7c87647d

第一次機會異常我按繼續選項我的代碼來到線TerminationFlag=false;,即使我已經處理控制處理程序中的Ctrl + C。你能告訴我最新的問題嗎?

+0

當第一次機會異常發生時,查看異常記錄以查看引發了什麼以及爲什麼。 –

+0

@RaymondChen如何看待異常記錄先生? – Dany

+0

異常記錄是傳遞給異常處理程序的'EXCEPTION_POINTERS'的一部分。一些調試器有一個特殊的命令來顯示當前的異常記錄。 (例如,windbg使用'.ecxr'。) –

回答

11

我假設您使用Microsoft Visual Studio從您的問題的描述。提出的第一個機會異常是由調試環境捕獲的CTRL-C事件。這是預期的行爲。

您可以選擇忽略此項:轉到調試菜單/ Exceptions/Win32 Exceptions並從「Thrown」列菜單中取出CONTROL-C檢查。這將確保調試器在用戶未處理時僅在CONTROL-C上斷開。見下圖:

enter image description here

順便說一句,你應該等待終止事件未輪詢的標誌。你可能想要類似於:

#include "windows.h" 
#include <iostream> 
HANDLE g_hTerminateEvent; 

BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType) 
{ 

    if (dwCtrlType == CTRL_C_EVENT || 
     dwCtrlType == CTRL_BREAK_EVENT || 
     dwCtrlType == CTRL_CLOSE_EVENT) 
    { 
     std::cout << "Terminating" << std::endl; 
     SetEvent(g_hTerminateEvent); 

     return TRUE; 
    } 
    return FALSE; 
} 
int main() 
{ 
    g_hTerminateEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL); 
    SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 

    DWORD result = WaitForSingleObject(g_hTerminateEvent, INFINITE); 
    return 0; 
} 
+0

我嘗試了你說的,但我仍然得到異常「在Smallsample.exe 0x7c87647d第一次機會異常:0x40010005:Control-C。「on pressinf ctrl + c – Dany

+0

嗨Dany,檢查包含在該示例中的圖片 - 確保在清除標誌40001005(Ctrl-C)後重建您的可執行文件。檢查您的設置 – Anthill

+0

我想我理解您的困惑的根源:CTRL -C是一箇中斷,爲了方便起見,Visual Studio在調試模式下生成一個DBG_CONTROL_C。Ctrl-C不是一個例外,它報告的是調試模式產生的DBG_CONTROL_C異常。 – Anthill

1

在調試器中運行此類事情時,您將永遠得不到相同的圖片,如果您將在沒有調試器的情況下運行它。在調試器中,您通常不能跨越進行控制檯輸入/輸出的系統功能。調試器將不可避免地與系統進行交互。

這裏最可靠的方法是追蹤。

這可能不會直接回答問題。

p.s.在您的代碼示例中,因爲它們現在不需要該事件。從MSDN

更新:

Value Meaning 
0 CTRL_C_EVENT 

甲CTRL + C信號被接收,或者從鍵盤輸入或從由GenerateConsoleCtrlEvent函數產生的信號。

+0

感謝您的回覆先生,那麼我該怎麼辦? – Dany

+0

我建議您將print語句放入您的處理函數中,以便打印接收到的參數的值。 –

+0

先生,我得到一個值DWORD dwCtrlType 0當我pree ctrl + c – Dany

相關問題