【发布时间】:2013-08-19 22:05:56
【问题描述】:
我在 Win32 C++ 控制台程序中处理 CTRL+C 事件时遇到了一些问题。
基本上我的程序如下所示:(基于另一个问题:Windows Ctrl-C - Cleaning up local stack objects in command line app)
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 中,函数处理程序在另一个线程中运行,因此当处理程序/线程结束其执行时,主线程处于休眠状态。大概这就是进程中断的原因吧?
【问题讨论】:
-
SetConsoleCtrlHandler返回什么? -
你确定
ConsoleHandler函数运行了吗?如果你在调试器中运行程序并在其中设置断点,它会在断点处停止吗? -
另外,您应该使用 BOOL 作为 retval,并使用 DWORD 作为 consoleHandler 的参数。另外,FALSE/TRUE 里面...
-
而你做在调用
SetConsoleCtrlHandler之前声明consoleHandler函数的函数原型? -
那如何检查循环后的代码没有执行呢?如果您在该代码处设置断点并在调试器中运行,它会停在那里吗?
标签: c++ winapi console-application