2012-11-03 8 views
5

ilk Chace özel durum alma: Görsel hata ayıklama seçeneğini başlatmak kullanarak çalıştırarak kod testBen Ctrl + C pencereler konsol uygulamasında basıldığında ne olur kontrol etmek için bir örnek yapılan niçin 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; 
} 

Ben ctrl + c bastığınızda stüdyo aşağıdaki mesaj 0x7c87647d

de

Birinci şans istisna olsun Devam et seçeneğine bastığımda, kontrol işleyicisinde Ctrl + C'yi kullanmamıza rağmen kodum TerminationFlag=false; hattına gelir. Lütfen bana sorunun ne olduğunu söyler misin?

+0

İlk şans istisnası oluştuğunda, nelerin yükseltildiğini ve neden olduğunu görmek için istisna kaydına bakın. –

+0

@RaymondChen İstisna kayıtlarına nasıl bakılır? – Dany

+0

Özel durum kaydı, istisna işleyicisine iletilen EXCEPTION_POINTERS öğesinin parçasıdır. Bazı hata ayıklayıcıları, geçerli özel durum kaydını göstermek için özel bir komut içerir. (Örneğin, windbg '.ecxr' kullanır.) –

cevap

11

Sorunun açıklamasından Microsoft Visual Studio'yu kullandığınızı kabul ediyorum. İlk şans istisnası, hata ayıklama ortamı tarafından yakalanan CTRL-C olaydır. Bu beklenen bir davranış.

Bunu göz ardı etmeyi seçebilirsiniz: Hata ayıklama menüsü/Özel durumlar/Win32 İstisnaları'na gidin ve "Atılan" sütun menüsünden KONTROL-C denetimini kaldırın. Bu, hata ayıklayıcının yalnızca kullanıcı tarafından işlenmediğinde CONTROL-C'yi kırmasını sağlar.

enter image description here

arada, sonlandırma olayı bir bayrak için değil yoklama bekliyor edilmelidir: Aşağıdaki resim bakınız. Şunları isteyebilirsiniz:

#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

Söylediklerinizi denedim ama yine de istisna alıyorum. "Smallsample.exe'de 0x7c87647d'deki ilk fırsat istisnası: 0x40010005: Control-C."pressinf ctrl + c – Dany

+0

Hi Dany, örnekte bulunan resmi kontrol edin - bayrak 40001005 (Ctrl-C) 'yi temizledikten sonra uygulamanızı yeniden oluşturduğunuzdan emin olun. Ayarlarınızı kontrol edin. – Anthill

+0

Sanırım karmaşanın kaynağını anlıyorum: CTRL -C bir kesme ve Visual Studio, kolaylık sağlamak için hata ayıklama modunda DBG_CONTROL_C üretir.Ctrl-C, rapor edilirken hata ayıklama modu tarafından oluşturulan DBG_CONTROL_C özel durum istisnası değildir. – Anthill

1

Hata ayıklayıcısında bu tür bir şeyi çalıştırırken, hata ayıklayıcısız olarak çalıştıracakmış gibi asla aynı resmi elde edemezsiniz. Hata ayıklayıcıda, genellikle, konsol giriş/çıkışını yapan sistem işlevlerini aşamazsınız. Hata ayıklayıcı, sistemle kaçınılmaz olarak etkileşime girecektir.

Buraya gitmenin en güvenilir yolu izleme.

Bu, doğrudan soruyu yanıtlamayabilir.

p.s. Kod örneklerinde şimdi oldukları gibi olaylara gerek yoktur. MSDN'den

Update: bir CTRL + C sinyal klavye girişi veya GenerateConsoleCtrlEvent işlevi ile üretilen bir sinyalden ya alındı ​​

Value Meaning 
0 CTRL_C_EVENT 

.

+0

Cevabınız için teşekkürler efendim, ne yapmalıyım? – Dany

+0

Alınan parametrenin değerini yazdırması için işleyicinize yazdırma ifadesini koymanızı öneririm. –

+0

efendim ben pree ctrl + c – Dany

İlgili konular