2012-11-03 9 views
5

में पहली Chace अपवाद हो रही मैं जब 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

@ रेमंड कैसे अपवाद रिकॉर्ड सर को देखने के लिए? – Dany

+0

अपवाद रिकॉर्ड अपवाद हैंडलर को पास किए गए 'EXCEPTION_POINTERS' का हिस्सा है। वर्तमान अपवाद रिकॉर्ड दिखाने के लिए कुछ डिबगर्स के पास एक विशेष कमांड होता है। (उदाहरण के लिए, विंडबग '.ecxr' का उपयोग करता है।) –

उत्तर

11

मुझे लगता है कि आप समस्या के विवरण से माइक्रोसॉफ्ट विजुअल स्टूडियो का उपयोग कर रहे हैं। पहला मौका अपवाद उठाया जा रहा है सीटीआरएल-सी घटना जो डीबगिंग पर्यावरण से फंस गई है। यह व्यवहार की उम्मीद है।

आप इसे अनदेखा करना चुन सकते हैं: डीबग मेनू/अपवाद/Win32 अपवादों पर जाएं और "थ्रोउन" कॉलम मेनू से नियंत्रण-सी चेक लें। इससे यह सुनिश्चित होगा कि डीबगर केवल उपयोगकर्ता-अनचाहे होने पर नियंत्रण-सी पर टूट जाता है।

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

मैंने जो कहा वह मैंने कोशिश की लेकिन फिर भी मुझे अपवाद मिल रहा है "0x7c87647d पर firstsample.exe: 0x40010005: नियंत्रण-सी में पहला मौका अपवाद।"pressinf ctrl + c – Dany

+0

हाय डनी, उदाहरण में शामिल तस्वीर की जांच करें - सुनिश्चित करें कि आप फ्लैग 40001005 (Ctrl-C) को साफ़ करने के बाद अपने निष्पादन योग्य का पुनर्निर्माण करें। अपनी सेटिंग्स जांचें। – Anthill

+0

मुझे लगता है कि मैं आपके भ्रम के स्रोत को समझता हूं: CTRL -सी एक बाधा है और विजुअल स्टूडियो सुविधा प्रयोजनों के लिए डीबग मोड में डीबीजी_CONTROL_C उत्पन्न करता है। Ctrl-C एक अपवाद नहीं है जो डीबग मोड द्वारा उत्पन्न डीबीजी_CONTROL_C अपवाद है। – Anthill

1

डीबगर में इस तरह की चीज चलाने पर आपको कभी भी वही तस्वीर नहीं मिलेगी जैसे आप इसे डीबगर के बिना चलाएंगे। डीबगर में आप आमतौर पर सिस्टम फ़ंक्शंस पर कदम नहीं उठा सकते जो कंसोल इनपुट/आउटपुट बनाते हैं। डीबगर यहां सिस्टम के साथ अपरिहार्य बातचीत करेगा।

यहां जाने का सबसे विश्वसनीय तरीका ट्रेसिंग है।

यह सीधे प्रश्न का उत्तर नहीं दे सकता है।

पेज। आपके कोड के नमूने में अब वे घटना की आवश्यकता नहीं है। MSDN से

अद्यतन:

Value Meaning 
0 CTRL_C_EVENT 

एक CTRL + C संकेत प्राप्त किया गया था, तो कुंजीपटल इनपुट से या GenerateConsoleCtrlEvent समारोह द्वारा उत्पन्न एक संकेत से।

+0

उत्तर महोदय के लिए धन्यवाद, तो मुझे क्या करना चाहिए? – Dany

+0

मैं आपको अपने हैंडलर में प्रिंट स्टेटमेंट डालने की सलाह दूंगा जो प्राप्त पैरामीटर के मान को प्रिंट करना चाहिए। –

+0

महोदय, मुझे dWORD dwCtrlType में एक मान 0 मिल रहा है जब मैं ctrl + c – Dany