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

关键控制台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);

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

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

  1. 面试全攻略,教你解锁程序员面试时的正确姿势

    面试全攻略,教你解锁程序员面试时的正确姿势 随着金九银十的到来很多人在考虑跳槽,特地奉上面试攻略,拿到offer不是梦 面试,难还是不难? 取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧. 面 ...

  2. 关闭计算机启动程序,电脑开机时自启动程序烦人,教你用系统自带程序关闭它!...

    电脑每次开启的时候会有一些应用程序也跟着自动启动,占用着电脑系统资源.有时候我们并不需要这些程序开启,那么我们如何关闭这些的开机自动启动项呢?这时,有装一些第三方安全管理软件的可以利用它们来管理,但这 ...

  3. 计算机程序怎么开机自动启动,开机自动运行程序怎么关闭 开机自启动程序关闭方法图解...

    有的朋友在使用电脑的时候总是需要安装一些软件,但对于如今的电脑软件,多数属于流氓性质,对于小白朋友安装一个软件,可能会同时安装多个软件,这就容易造成开机自动启动的行为,尤其是本来电脑配置就不高,还弄了 ...

  4. win10运行在哪里打开_Win10在哪里卸载软件程序?Win10四种正确卸载软件或者游戏的方法...

    如今Win10系统已经是目前主流的操作系统,各个功能都十分完善了,可能熟悉Win7或者XP的朋友,刚刚开始使用Win10操作系统的一些朋友,连卸载软件程序都不知道怎么卸载,找不到地方.那么Win10在 ...

  5. 计算机等待程序关闭,教您win10系统关闭计算机弹出“等待后台程序关闭”无法关机的技巧...

    今天和大家分享一下win10系统关闭计算机弹出"等待后台程序关闭"无法关机问题的解决方法,在使用win10系统的过程中经常不知道如何去解决win10系统关闭计算机弹出"等 ...

  6. wps2016向程序发送命令_Excel:向程序发送命令时出现问题

    同事的笔记本上excel出现问题,一双击打开就出现提示:"向程序发送命令时出现问题",然后就只打开一个空的excel,然而如果先打开一个空白的excel,再从它的菜单中打开exce ...

  7. VS2019 MFC模式下如何调用控制台并用cprintf在控制台打印

    VS2019 MFC模式下如何调用控制台并用cprintf在控制台打印 哪个大冤种还在用MFC,哦是我 运行MFC程序,界面出来的时候一般是没有控制台的,也就是说看不到任何printf的结果,有时候就 ...

  8. xendesktop 打开DDC的Desktop Studio控制台和用户访问Web Interface有时候会非常慢

    在配置ddc前,可以先做一下设置: DDC无法直接连接到Internet时,打开DDC的Desktop Studio控制台和用户访问Web Interface有时候会非常慢,这个是由于微软.net F ...

  9. linux关闭串口控制台输入,关闭Linux中的串口打印

    项目中用到串口通信,但是这个串口也用于控制台.为了保证串口通信时不能有控制台发出的消息,需要关闭打印. 在测试过程中发现,有三种类型的打印,一是uboot的打印,在Starting kernel .. ...

最新文章

  1. java栈、堆、方法区
  2. @class和#import
  3. shuoj 418 丢史蒂芬妮(素数筛+sg函数)
  4. CALL FUNCTION START NEW TASK
  5. 【BZOJ2300】【SCOI2011】糖果
  6. 对01背包的分析与理解(图文)
  7. C++入门指南及实战 第一步 概述及经典HelloWorld
  8. 数学建模 匈牙利算法求解整数规划基本原理与编程实现
  9. 教师管理系统设计报告java_教师办公管理系统的设计与实现
  10. 20110128 学习记录:Datalist中的item项不自动换行而只用空格隔开
  11. 稳态可压Navier-Stokes方程组在修正Dirichlet边界下的解的存在性
  12. banner 图片自动轮播
  13. 超实用的Mac风扇控制系统:Macs Fan Control Pro mac中文版
  14. 旋转(Rotation)矩阵转欧拉角(euler)
  15. Link第一次打包与部署笔记
  16. php公众号提现功能,公众号赞赏提现
  17. 小米路由器 ping 测试软件,小米路由器3 测试: 自建简单智能家居
  18. Android输入法window类型,android输入法windowSoftInputMode属性详解章
  19. 分享一组纯css动态好看的天气图标
  20. 农场游戏果园系统+牧场养殖系统+广告联盟模式流量主游戏小程序APP V1

热门文章

  1. 反问疑问_句子练习大全(反问、疑问、设问、病句等练习)
  2. C/Cpp / C++ 构造函数和析构函数可以是虚函数吗
  3. 堆栈的生长方向和空栈满栈的区别
  4. 分享篇--esp32直连天猫精灵
  5. 使用ESP32能驱动电子墨水屏吗?
  6. python备份发包脚本_Python备份脚本,python
  7. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用
  8. Android 拦截WebView请求,并加入或修改参数(GET)
  9. Python(39)_选出列表中的大于66的数字放在字典中
  10. CAD二次开发之入门坑