在 Win32 上处理 CTRL C

新手上路,请多包涵

我在 Win32 C++ 控制台程序中处理 CTRL + C 事件时遇到了一些问题。

基本上我的程序看起来像这样:(基于另一个问题: Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象

 bool running;

int main() {

    running = true;
    SetConsoleCtrlHandler((PHANDLER_ROUTINE) consoleHandler, TRUE);

    while (running) {
       // do work
       ...
    }

    // do cleanup
    ...

    return 0;
}

bool consoleHandler(int signal) {

    if (signal == CTRL_C_EVENT) {

        running = false;
    }
    return true;
}

问题是根本没有执行清理代码。

在处理函数执行后,进程终止,但在主循环之后不执行代码。怎么了?

编辑:根据要求,这是一个类似于我的程序的最小测试用例:http: //pastebin.com/6rLK6BU2

我的输出中没有“测试清理指令”字符串。

我不知道这是否重要,我正在使用 MinGW 进行编译。


编辑 2:测试用例程序的问题是使用 Sleep() 函数。没有它,程序按预期工作。

在 Win32 中,函数处理程序在另一个线程中运行,因此当处理程序/线程结束其执行时,主线程正在休眠。可能这是进程中断的原因?

原文由 eang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

以下代码适用于我:

 #include <windows.h>
#include <stdio.h>

BOOL WINAPI consoleHandler(DWORD signal) {

    if (signal == CTRL_C_EVENT)
        printf("Ctrl-C handled\n"); // do cleanup

    return TRUE;
}

int main()
{
    running = TRUE;
    if (!SetConsoleCtrlHandler(consoleHandler, TRUE)) {
        printf("\nERROR: Could not set control handler");
        return 1;
    }

    while (1) { /* do work */ }

    return 0;
}

原文由 László Papp 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题