vc控制台程序关闭事件时的处理方式是什么
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇内容介绍了"vc控制台程序关闭事件时的处理方式是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2024年09月22日vc控制台程序关闭事件时的处理方式是什么
本篇内容介绍了"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控制台程序关闭事件时的处理方式是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
控制台
控制
标记
代码
状态
线程
事件
函数
更多
知识
死锁
善后
输出
方式
程序
处理
内容
实用
美好
舒服
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库连接外部数据
长沙创新网络技术
大数据云服务器怎么赚钱
卫星上有语言数据库吗
数据库是干什么工作的
思科网络技术学院教程第二版
linux服务器日志分析
服务器im分区工具
人才数据库证书查询是真的吗
简单的理解数据库
护苗网络安全课rar
网络安全排面
泉州 服务器托管
可以装程序的服务器
重庆度度互联网科技有限公司
hm软件开发公司
大专计算机网络技术干嘛的
怎样查询sql数据库
武汉新品质互联网科技有限公司
江苏关闭服务器
中国网络安全市场全景图
云龙数据库工程师招聘
方舟非官方服务器模组
软件开发等于写代码么
命令行 查询数据库
安康市网络安全绘画活动获奖
国安网络安全部
光纤最新网络技术
服务器网络安全检查
数据库转换成文件