gpt4 book ai didi

c++ - 关闭控制台时如何正确处理 SIGBREAK?

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:41 38 4
gpt4 key购买 nike

我必须捕获 click on close button of console 事件,它对应于 ctrl-break 事件 SIGBREAK 但显然有一种超时不允许让我做任何超过 5 秒的事情,在什么程序似乎被中止之后(所以消息 “正确结束!” 永远不会发生)。

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

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

注意 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 reference :

The system also displays the dialog box if the process does not respond within a certain time-out period (5 seconds for CTRL_CLOSE_EVENT, and 20 seconds for CTRL_LOGOFF_EVENT and CTRL_SHUTDOWN_EVENT).

A process can use the SetProcessShutdownParameters function to prevent the CTRL_LOGOFF_EVENT and CTRL_SHUTDOWN_EVENT dialog box from being displayed. In this case, the system just terminates the process when a HandlerRoutine returns TRUE or when the time-out period elapses.

另一种方法如何,只需禁用控制台窗口的关闭按钮:

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

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

关于c++ - 关闭控制台时如何正确处理 SIGBREAK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25266093/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com