closures控制台时如何正确处理SIGBREAK?

我必须捕捉控制台事件closuresbutton上点击 ,这与ctrl-break事件SIGBREAK相对应,但显然有一种超时,它不允许我做超过5秒的任何事情,在程序似乎中止之后所以消息“正确结束!”将永远不会发生)。

如何强制系统执行closures操作直至结束(或将超时延长至60秒)?

注意:使用相同的方法,我可以使用fflush(stdout);成功处理CTRL + C事件( SIGINT fflush(stdout);doStuffs();之前doStuffs();

注2:我的代码是基于这个答案: https : //stackoverflow.com/a/181594/1529139

 #include <csignal> void foo(int sig) { signal(sig, foo); // (reset for next signal) // do stuffs which takes aboutly 15 seconds doStuffs(); cout << "Properly ended !"; } int main(DWORD argc, LPWSTR *argv) { signal(SIGBREAK, foo); myProgramLoop(); } 

我相信超时是固定的,无法修改它,请参阅API参考 :

如果进程在特定超时期限(CTRL_CLOSE_EVENT为5秒,CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT为20秒)内没有响应,系统也会显示对话框。

进程可以使用SetProcessShutdownParameters函数来防止显示CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT对话框。 在这种情况下,当HandlerRoutine返回TRUE或超时时间结束时,系统才会终止进程。

怎么样的替代方法,只是禁用您的控制台窗口的关闭按钮:

 GUITHREADINFO info = {0}; info.cbSize=sizeof(info); GetGUIThreadInfo(NULL, &info); HMENU hSysMenu = GetSystemMenu(info.hwndActive, FALSE); EnableMenuItem(hSysMenu, SC_CLOSE, MF_GRAYED); 

现在,您可以安全地通过Ctrl-C或其他键盘输入来处理关闭。