百度可以找到很多关于这个问题解决的方法
关键控制台api函数:tconsolectrlhandler
在支持c++ 11以上的编译器中,你可以这么做。
tconsolectrlhandler([](dword fdwctrltype)->bool { if (fdwctrltype == ctrl_cl学分互认o_event) { // 你的善后代码... return true; } return fal;}, true);
最初这么做是很舒服的,但之后发现了问题:
windows控制台在标记状态下,printf之类的输出函数,会阻塞在标记选择时(点控制台左上角-编辑-标记)。
这就导致了,我们的善后代码中,可能会死锁,例如你要优雅的结束一个线程,这个线程在最后的时候printf了。
线程里printf等待标记状态,tconsolectrlhandler回调函数里等待线程结束,总之就是死锁。
我本来想着,去找到能够获取这种标记状态的控制台api一元二次方程怎么解,但找了很久都没有结果。
最后,我就考虑,有没有方法让printf不与标记状态发生死锁,答案是: 输出流重定向。
所以,代码变成这样:
tconsolectrlhandler([](dword fdwctrltype)->bool { if (fdwctrltype == ctrl_clo_event) { char szbuf[0x1000]; tvbuf(stdout, szbuf, _iofbf, 0x1000); // 你的善后代码... return true; } return fal;}, true);
这么做之后,世界果然更美好了,如果最后这些日志信息对你来广东白云学院学费说是重要的,那么你可能需要写更多代码去实现。
知识点扩展:
实例:
bool winapi consolehandler(dword cevent){dword e = 0;switch (cevent){ca ctrl_c_event:e = ctrl_c_event;break;ca ctrl_break_event:e = ctrl_break_event;break;ca ctrl_clo_even全国大学生人数t:e = ctrl_clo_event;break;ca ctrl_logoff_event:break;ca ctrl_shutdown_event:break;}return true;}int main(int argc, char* argv[]){if (tc博浪沙onsolectrlhandler((phandler_routine)consolehandler, true) == fal){//安装失败return -1;}generateconsolectrlevent(ctrl_c_event, 0); //手工产生一事件}
到此这篇关于vc控制台程序关闭事件时的处理方式及注意点详解的文章就介绍到这了,更多相关vc控制台程序关闭事件时的正确处理方式内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 00:52:49,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/36e78925334552fbf82256f204902aab.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:vc控制台程序关闭事件时的处理方式及注意点详解.doc
本文 PDF 下载地址:vc控制台程序关闭事件时的处理方式及注意点详解.pdf
留言与评论(共有 0 条评论) |