首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭控制台窗口时的优雅退出

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

Stack Overflow用户
提问于 2015-02-18 23:52:46
回答 2查看 4.2K关注 0票数 7

当关闭按钮被击中时,我正在尝试从控制台应用程序中优雅地退出。

代码语言:javascript
复制
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";
}

我的处理程序被正确地调用,但是主线程之后不会继续,所以"bye“永远不会发生。如果我捕获CTRL_C_EVENT并在控制台中命中^C,那么主线程允许继续并优雅地退出。是否有办法允许主线程在控制台关闭时优雅地退出?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-19 00:32:11

谢谢乔纳森的提示。

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

代码语言:javascript
复制
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";
}
票数 7
EN

Stack Overflow用户

发布于 2018-01-10 14:52:19

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

代码语言:javascript
复制
if (event == CTRL_CLOSE_EVENT)
{
    ExitThread(0);
//  return TRUE; // warning C4702: unreachable code
}

ExitThread将终止调用ctrl_handler的线程。这样就不会调用ExitProcess,并且您的主线程将能够执行所有所需的清理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28596235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档