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);

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

知识点扩展:

实例:

BOOL WINAPI ConsoleHandler(DWORD CEvent)
{
DWORD e = 0;
switch (CEvent)
{
case CTRL_C_EVENT:
e = CTRL_C_EVENT;
break;
case CTRL_BREAK_EVENT:
e = CTRL_BREAK_EVENT;
break;
case CTRL_CLOSE_EVENT:
e = CTRL_CLOSE_EVENT;
break;
case CTRL_LOGOFF_EVENT:
break;
case CTRL_SHUTDOWN_EVENT:
break;
}
return true;
}
int main(int argc, char* argv[])
{
if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE) == FALSE)
{
//安装失败
return -1;
}
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); //手工产生一事件
}

到此这篇关于vc控制台程序关闭事件时的处理方式及注意点详解的文章就介绍到这了,更多相关vc控制台程序关闭事件时的正确处理方式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vc控制台程序关闭事件时的处理方式及注意点详解

    百度可以找到很多关于这个问题解决的方法 关键控制台API函数:SetConsoleCtrlHandler 在支持C++ 11以上的编译器中,你可以这么做. SetConsoleCtrlHandler([](DWORD fdwctrltype)->BOOL { if (fdwctrltype == CTRL_CLOSE_EVENT) { // 你的善后代码... return TRUE; } return FALSE; }, TRUE); 最初这么做是很舒服的,但之后发现了问题: Windows控

  • 微信小程序开发数据缓存基础知识辨析及运用实例详解

    提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容. 提示:以下是本篇文章正文内容,下面案例可供参考 一.微信数据缓存是什么? 在实际开发中,在用到一个数据时,我们需要调用api接口去得到,然后渲染在页面中,但是对于一些数据,是经常需要使用的,如果每次使用时都需要调用api接口,会十分麻烦.数据缓存就解决了这个问题,我们可以在初次调用某api得到数据的同时将数据缓存,那么在之后的使用过程

  • 微信小程序使用uni-app实现首页搜索框导航栏功能详解

    目录 前言 一.兼容APP与H5的方式 二.兼容小程序 三.实现同时兼容 前言 首页都会提供一个搜索框给到客户,让客户自己去搜索自己想要的内容,这里就需要导航栏,来实现搜索页面的跳转,效果如下 App.H5效果 小程序效果 一.兼容APP与H5的方式 在常见titleNView配置代码示例中可以看到基本样式的代码如下 { "pages": [{ "path": "pages/index/index", //首页 "style"

  • 使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解

    最近在做项目时,遇到了需要用到多选按钮选中触发事件的功能,因此我查找了一下AngularJS的提供的指令,但是没有发现相应的指令.而一个看起来很像的指令就是ng-checked,但是这个指令是用来代替标签里面checked属性的,所以也用不了.因此我就自己动手试着写一个这样的指令,相应的代码如下: <form name="test_form" ng-controller="TestCtrl"> <input type="checkbox&

  • 微信小程序 增、删、改、查操作实例详解

    微信小程序 增.删.改.查操作实例详解 1.以收货地址的增删改查为例 2.文件目录 js文件是逻辑控制,主要是它发送请求和接收数据, json 用于此页面局部 配置并且覆盖全局app.json配置, wxss用于页面的样式设置, wxml就是页面,相当于html <form bindsubmit="addSubmit"> <view class="consignee"> <text class="consignee-tit&q

  • 微信小程序中form 表单提交和取值实例详解

    微信小程序中form 表单提交和取值实例详解 我们知道,如果我们直接给 input 添加 bindinput,比如:<input bindinput="onUsernameInput" />,那么可以在 onUsernameInput 中直接使用 e.detail.value,即: onUsernameInput : function(e) { e.detail.value; } 但是,如果有多个输入控件,我们不可能为每个控件添加 bindinput.bindchange

  • java异常继承何类,运行时异常与一般异常的区别(详解)

    一.基本概念 Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,java.lang.Exception Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类. Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题.大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java

  • 小程序:授权、登录、session_key、unionId的详解

    微信应用的一个很大的优势就在于使用过程中是不需要进行注册和显式登录的,大部分问题基本上可以一键解决.但是在授权.登录和获取用户信息的过程中都发生了哪些事情,今天我们就来讨论一下.这篇文章主要分析以下几个问题: 授权和登录的意义 session_key 的作用 unionId 的作用,有哪些获取途径 在应用中如何保存用户登录态 1. 授权和登录的意义 首先必须要明白,授权和登录实际上是两个操作. 1.1 授权(已废弃) 那授权的作用是啥呢?从小程序官方文档中我们可以看到授权操作只需通过wx.aut

  • uni-app微信小程序登录并使用vuex存储登录状态的思路详解

    微信小程序注册登录思路 (这是根据自身的项目的思路,不一定每个项目都适用) 1.制作授权登录框,引导用户点击按钮 2.uni.login获取code 3.把code传给后端接口,后端返回如下数据 openid: "ogtVM5RWdfadfasdfadfadV5s" status: 1 // 状态码:status==0(该用户未注册,需调用注册接口) status==1(该用户已注册) 4.判断用户是否注册,并调用用户信息接口 (1)若已注册则提示登录成功,并调用后台给的获取用户信息的

  • 微信小程序 点击控件后选中其它反选实例详解

    微信小程序 点击控件后选中其它反选实例详解 前言: 如果需要实现进来进行给按钮加上买一送一的样式,或者单击就选中单个按钮,只能靠css结合js进行控制了,小程序暂时没有这样的控件. 实现效果图: 微信小程序进来的时候自动进行按钮样式的初始化,这个需要一个字段做判断,加上正则表达式wxml文件: <block wx:for="{{liuliangItems}}"> <block wx:if="{{item.one2one == 1}}"> &l

随机推荐