欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

mfc打开控制台异常关闭_vc控制台程序关闭事件时的正确处理方式

发布时间:2024/10/8 c/c++ 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 mfc打开控制台异常关闭_vc控制台程序关闭事件时的正确处理方式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

百度可以找到很多关于这个问题解决的方法

关键控制台API函数:SetConsoleCtrlHandler

在支持C++ 11以上的编译器中,你可以这么做。

SetConsoleCtrlHandler([](DWORD fdwctrltype)->BOOL {

if (fdwctrltype == CTRL_CLOSE_EVENT) {

// 你的善后代码...

return TRUE;

}

return FALSE;

}, TRUE);

最初这么做是很舒服的,但之后发现了问题:

Windows控制台在标记状态下,printf之类的输出函数,会阻塞在标记选择时(点控制台左上角-编辑-标记)。

这就导致了,我们的善后代码中,可能会死锁,例如你要优雅的结束一个线程,这个线程在最后的时候printf了。

线程里printf等待标记状态,SetConsoleCtrlHandler回调函数里等待线程结束,总之就是死锁。

我本来想着,去找到能够获取这种标记状态的控制台API,但找了很久都没有结果。

最后,我就考虑,有没有方法让printf不与标记状态发生死锁,答案是: 输出流重定向。

所以,代码变成这样:

SetConsoleCtrlHandler([](DWORD fdwctrltype)->BOOL {

if (fdwctrltype == CTRL_CLOSE_EVENT) {

char szbuf[0x1000];

setvbuf(stdout, szbuf, _IOFBF, 0x1000);

// 你的善后代码...

return TRUE;

}

return FALSE;

}, TRUE);

这么做之后,世界果然更美好了,如果最后这些日志信息对你来说是重要的,那么你可能需要写更多代码去实现。

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的mfc打开控制台异常关闭_vc控制台程序关闭事件时的正确处理方式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。