我在VS2017 / Windows 10中构建了以下程序。当我运行它时,我按下了并按预期调用了ctrl_handler()
,但是在大约三秒后,该过程无论如何都被强制终止。
这是一个问题,因为我的真实应用程序会写入大型日志文件,而三秒钟的时间不足以将它们放到磁盘上。
描述此行为的文档在哪里?它不在those for the CTRL+CLOSE signal中。
超时设置在哪里?可以在应用程序级别进行修改吗?或者使用团体政策?
#include <Windows.h>
bool mainThreadRunning;
bool mainThreadFinished;
BOOL ctrl_handler(DWORD event)
{
if (event == CTRL_CLOSE_EVENT) {
mainThreadRunning = false;
while (!mainThreadFinished) {
Sleep(100);
}
return TRUE;
}
return FALSE;
}
int main()
{
mainThreadRunning = true;
mainThreadFinished = false;
SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE); // make sure when the user hits the close button in the console we shut down cleanly
while (true)
{
}
return 0;
}
答案 0 :(得分:2)
我想你正在寻找this is the reference:
不幸的是,这是由操作系统决定的。有文档描述了HandlerRoutine Callback文档中的行为:
&#34;在这种情况下,不会调用其他处理函数,系统会显示一个弹出对话框,询问用户是否终止进程。如果进程在某个超时期限内没有响应,系统也会显示此对话框(CTRL_CLOSE_EVENT为5秒,CTRL_LOGOFF_EVENT或CTRL_SHUTDOWN_EVENT为20秒)。&#34;
没有(至少公开的,记录在案的)API来更改此超时。
注意:
进程可以使用
SetProcessShutdownParameters
函数来防止系统在注销或关闭期间向用户显示对话框。在这种情况下,当HandlerRoutine返回TRUE 或超时时间过去时,系统将终止该过程。
如果操作系统认为处理程序花费了太多时间来完成,则会故意强制终止。
从以下评论中提取的重要提示:
... Ctrl + C 不受超时限制(我已对其进行了测试,以及我现在正在使用的内容)。