为什么在c ++中获得第一个chace异常

Dan*_*any 6 c++ exception visual-studio-2010 visual-c++

我做了一个示例来检查在Windows控制台应用程序中按下Ctrl + 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;
}
Run Code Online (Sandbox Code Playgroud)

我通过在visual studio中使用启动调试选项运行它来测试代码,当我按下ctrl + c时,我收到以下消息

0x7c87647d处的第一次机会异常

当我按下继续选项时,TerminationFlag=false;即使我在控制处理程序中处理了Ctrl + C,我的代码也会出现.你能告诉我这个问题吗?

Ant*_*ill 11

我假设您从问题描述中使用Microsoft Visual Studio.引发的第一个机会异常是CTRL-C事件,它被调试环境所困.这是预期的行为.

您可以选择忽略它:转到Debug菜单/ Exceptions/Win32 Exceptions并从"Thrown"列菜单中取出CONTROL-C检查.这将确保调试器仅在用户未处理时在CONTROL-C上中断.见下图:

在此输入图像描述

顺便说一下,您应该等待终止事件而不是轮询标志.您可能需要以下内容:

#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;
}
Run Code Online (Sandbox Code Playgroud)