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)