为什么我的Windows控制台关闭事件处理程序超时?

时间:2017-10-31 17:37:45

标签: c++ windows winapi console-application

我在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;
}

1 个答案:

答案 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 不受超时限制(我已对其进行了测试,以及我现在正在使用的内容)。