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

      

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

  • 相关阅读:
    解决Centos7下中文显示乱码
    Pycharm2019.2.1永久激活
    window 共享打印机
    看着前车轮胎能出库
    计算之道 (置换的玩笑)搜索
    GIS+=地理信息+云计算技术——私有云架构设计(2)网络资源规划
    串的模式匹配
    1.Linux下libevent和memcached安装
    STL--H
    【数据结构与算法】(二) c 语言链表的简单操作
  • 原文地址:https://www.cnblogs.com/babypapa/p/13032603.html
Copyright © 2020-2023  润新知