我在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
我的输出中没有得到“ test cleanup-instruction”字符串。
我不知道这是否重要,我正在使用MinGW进行编译。
编辑2:测试用例程序的问题是该Sleep()
功能的使用。没有它,该程序将按预期工作。
在Win32中,函数处理程序在另一个线程中运行,因此当处理程序/线程结束执行时,主线程处于休眠状态。这可能是过程中断的原因吗?
以下代码对我有用:
#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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句