SetConsoleCtrlHandler例程问题

Jer*_*emy 19 c++ windows console-application

我正在用C++编写一个控制台应用程序.

我使用SetConsoleCtrlHandler来捕获close和CTRL + C按钮.这允许我的所有线程停止并正确退出.

其中一个线程执行一些保存,需要一些时间来完成,我有一些代码在控制台crtl句柄例程中等待.MSDN指定CTRL_CLOSE_EVENT在5秒后弹出一个框,但我的进程退出.

这对于调试控制台应用程序也很烦人,因为在您可以单步执行之前进程退出并且我不知道可能是什么问题(我有Windows 7 64位).

另外,奇怪的是如果我的例程返回TRUE(只是禁用关闭操作),它仍然会关闭应用程序.该例程会被调用,因此SetConsoleCtrlHandler已成功安装.

例如:

BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType)
{
    if (dwCtrlType == CTRL_CLOSE_EVENT)
    {
        return TRUE;
    }

    return FALSE;
}

int _tmain(int argc, _TCHAR* argv[])
{
    BOOL ret = SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE);

    while (true)
    {
        Sleep(1000);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 17

您似乎无法再忽略Windows 7上的关闭请求.

确实得到了CTRL_CLOSE_EVENT事件,从那一刻开始,你需要10秒钟才能完成自动关闭之前需要做的事情.因此,您可以在处理程序中执行您需要执行的任何操作,也可以设置全局标志.

case CTRL_CLOSE_EVENT: // CTRL-CLOSE: confirm that the user wants to exit.
                       close_flag = 1;
                       while(close_flag != 2)
                         Sleep(100);
                       return TRUE;
Run Code Online (Sandbox Code Playgroud)

有趣的事实:当CTRL_CLOSE_EVENT事件中的代码运行时,主程序继续运行.所以你将能够检查标志并执行'close_flag = 2;' 某处.但请记住,你只有10秒钟.(所以请记住,你不想挂断等待键盘输入的主程序流程.)

  • 10秒的时间只是事实的一半.一旦处理程序返回,应用程序将终止,因此您必须保持处理程序运行. (13认同)