Jer*_*emy 19 c++ windows console-application
我正在用C++编写一个控制台应用程序.
我使用SetConsoleCtrlHandler来捕获close和CTRL + C按钮.这允许我的所有线程停止并正确退出.
其中一个线程执行一些保存,需要一些时间来完成,我有一些代码在控制台crtl句柄例程中等待.MSDN指定CTRL_CLOSE_EVENT在5秒后弹出一个框,但我的进程退出.
这对于调试控制台应用程序也很烦人,因为在您可以单步执行之前进程退出并且我不知道可能是什么问题(我有Windows 7 64位).
另外,奇怪的是如果我的例程返回TRUE(只是禁用关闭操作),它仍然会关闭应用程序.该例程会被调用,因此SetConsoleCtrlHandler已成功安装.
例如:
BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
{
return TRUE;
}
return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
BOOL ret = SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE);
while (true)
{
Sleep(1000);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
小智 17
您似乎无法再忽略Windows 7上的关闭请求.
你确实得到了CTRL_CLOSE_EVENT事件,从那一刻开始,你需要10秒钟才能完成自动关闭之前需要做的事情.因此,您可以在处理程序中执行您需要执行的任何操作,也可以设置全局标志.
case CTRL_CLOSE_EVENT: // CTRL-CLOSE: confirm that the user wants to exit.
close_flag = 1;
while(close_flag != 2)
Sleep(100);
return TRUE;
Run Code Online (Sandbox Code Playgroud)
有趣的事实:当CTRL_CLOSE_EVENT事件中的代码运行时,主程序继续运行.所以你将能够检查标志并执行'close_flag = 2;' 某处.但请记住,你只有10秒钟.(所以请记住,你不想挂断等待键盘输入的主程序流程.)
| 归档时间: |
|
| 查看次数: |
16171 次 |
| 最近记录: |