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

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

  

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

vc控制台程序关闭事件时的正确处理方式的更多相关文章

  1. 截获控制台程序关闭事件(SetConsoleCtrlHandler)

    最近控制台程序中需要捕获控制台关闭事件,在用户关闭的时候进行某些操作,找了一大圈发现了一个方法,通过调用WIN32 API SetConsoleCtrlHandler方法来实现,具体代码如下: usi ...

  2. [No000090]C#捕获控制台(console)关闭事件及响应cmd快捷键

    捕获控制台(console)关闭事件: 1.Ctrl+C信号: 2.Ctrl+Break信号: 3.用户系统关闭Console时: 4.用户退出系统时: 5.系统将要关闭时: using System ...

  3. C# 控制台程序 托盘图标 事件响应

    static void Main(string[] args) { NotifyIconHelper ni = new NotifyIconHelper(); NotifyIconHelper.Sho ...

  4. winform程序关闭界面时弹出提示框

    void Form1_FormClosing(object sender, FormClosingEventArgs e){ if (MessageBox.Show( "窗口关闭后,数据即将 ...

  5. .net桌面程序或者控制台程序使用NLog时的注意事项

    Nuget添加NLog 添加nlog.config文件,并选择属性->始终复制 不选择始终复制,编译后nlog.config是没有的. 具体使用: private static readonly ...

  6. React阻止事件冒泡的正确打开方式

    需求:点击导航list按钮出现侧弹框,点击空白处弹框消失 问题:绑定空白处的点击事件到document上,但是非空白处的点击也会触发这个点击事件,在react中如何阻止事件冒泡? 解决方法:e.sto ...

  7. 【Visual Studio】控制台程序运行时一闪而过

    问题:写一个C#控制台程序,运行时控制台一闪而过.程序结束.无法看清控制台输出的结果. 办法: 方法一二三都有人写过百度经验了:怎么解决VS运行程序一闪而过 其实还有一种办法,就是把控制台程序改为Wi ...

  8. .NET CORE与Spring Boot编写控制台程序应有的优雅姿势

    本文分别说明.NET CORE与Spring Boot 编写控制台程序应有的“正确”方法,以便.NET程序员.JAVA程序员可以相互学习与加深了解,注意本文只介绍用法,不会刻意强调哪种语言或哪种框架写 ...

  9. .NET CORE编写控制台程序应有的优雅姿势(转载)

    原文地址:https://www.cnblogs.com/zuowj/p/11107243.html 本文所说的编写控制台程序应有的“正确”方法,我把正确二字加上引号,因为没有绝对的正确,因人而异,因 ...

随机推荐

  1. vue混入mixin的使用,保证你看的明明白白!

    场景描述 有些时候,我们发现有些组件部分功能代码是几乎是一样的. 这个时候,我们就可以将相同的逻辑代码抽离出来 此时我们的主角混入mixin就登场了 下面我们有a-test和b-test两个组件,点击 ...

  2. js和jq文档操作

    JS文档操作 一.dom树结构 1.元素节点 2.文本节点 3.属性节点      不属于元素节点的子节点  4.文档节点(document) 二.处理元素节点    method    1.docu ...

  3. MySQL中特别实用的几种SQL语句送给大家

    在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑.减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮. 目录 实用的SQL 1.插 ...

  4. 羽夏看Win系统内核——系统调用篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  5. initNativeTransServiceId . ntrans:object componentId :-368613127 微信小程序

    二维码打开的页面是否存在 注意:体验版二维码默认路径是 pages/index/index 我的因为分包的原因调整了首页路径 所以路径是pages/tabBar/search/search 如果不是这 ...

  6. 公司项目被扫出来一个Druid未授权访问漏洞

    这不是阿里druid的监控页面吗?接下来查看项目配置 1.在web.xml中有如下配置: <filter> <filter-name>DruidWebStatFilter< ...

  7. Part 27 Remove # from URL AngularJS

    There are 4 simple steps to remove # from URLs in Angular. Step 1 : Enable html5mode routing. To do ...

  8. 基于WPF的酷炫GUI窗口的实现全过程

    title: 基于WPF的酷炫GUI窗口的实现全过程 date: 2020-08-14 permalink: /build/wpfgui sidebarDepth: 2 tags: wpf gui 软 ...

  9. 单线程 Redis 为什么这么快,看看这篇就知道了

    Redis 作为一种 KV 缓存服务器,有着极高的性能,相对于 Memcache,Redis 支持更多种数据类型,因此在业界应用广泛. 记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于 ...

  10. Node.js实现前后端交换——用户登陆

    最近学习了一点Node.js的后端知识,于是作为一个学习前端方向的我开始了解后端,话不多说,开始介绍.首先,如果你想要更好的理解这篇博客,你需要具备html,css,javascript和Node.j ...