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

标签 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";
}

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

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

最佳答案

感谢乔纳森的提示。

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

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";
}

关于c++ - 关闭控制台窗口时优雅退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28596235/

相关文章:

C++ WinAPI - 草率的鼠标输入

delphi - GUID 类型是什么?

c++ - 库中没有匹配的调用函数

python - 如何在按下按钮时查看菜单?

C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是什么?

python - 属性错误 : module 'tensorflow' has no attribute 'float32'

c++ - 如何使用 C++ Win32API 检查 ADuser "Password never expires"属性检查或不检查?

c++ - 如何测量C math.h库函数的执行时间?

c++ - 将 LPCWSTR 与另一个字符串组合

c++ - 为什么我的类节点会覆盖自身而不是创建新的节点对象