关闭控制台窗口时优雅退出

时间:2015-02-18 23:52:47

标签: c++ windows winapi

当关闭关闭按钮时,我试图从控制台应用程序中正常退出。

bool done = false;

BOOL ctrl_handler(DWORD event)
{
    if (event == CTRL_CLOSE_EVENT) {
        done = true;
        return TRUE;
    }
    return FALSE;
}

int main()
{
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE);

    while (!done)
        do_stuff();

    cleanup();
    cout << "bye";
}

我的处理程序被正确调用,但主线程之后没有恢复,所以&#34;再见&#34;永远不会发生如果我改为捕获CTRL_C_EVENT并在控制台中点击^ C,则允许主线程继续并正常退出。有没有办法允许主线程在控制台关闭时正常退出?

我也尝试过使用std :: signal,但它是一样的。适用于^ C但不适用于窗口关闭。

2 个答案:

答案 0 :(得分:5)

感谢Jonathan的提示。

我看到处理程序在它自己的线程上被调用。如果处理程序返回,则整个进程被强制退出,因此我们需要给主线程时间自行退出。

bool done = false;

BOOL ctrl_handler(DWORD event)
{
    if (event == CTRL_CLOSE_EVENT) {
        done = true;
        Sleep(20000); // force exit after 20 seconds
        return TRUE;
    }
    return FALSE;
}

int main()
{
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE);

    while (!done)
        do_stuff();

    cleanup();
    cout << "bye";
}

答案 1 :(得分:1)

我认为更好的方法是使用:

if (event == CTRL_CLOSE_EVENT)
{
    ExitThread(0);
//  return TRUE; // warning C4702: unreachable code
}

ExitThread将终止调用ctrl_handler的线程。这种方式ExitProcess将不会被调用,您的主线程将能够执行所有需要的清理。