iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >vc控制台程序关闭事件时的处理方式及注意点详解
  • 883
分享到

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

2024-04-02 19:04:59 883人浏览 独家记忆
摘要

百度可以找到很多关于这个问题解决的方法 关键控制台api函数:SetConsoleCtrlHandler 在支持c++ 11以上的编译器中,你可以这么做。 SetConsoleC

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

关键控制台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控制台程序关闭事件时的正确处理方式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vc控制台程序关闭事件时的处理方式及注意点详解

本文链接: https://www.lsjlt.com/news/159162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vc控制台程序关闭事件时的处理方式及注意点详解
    百度可以找到很多关于这个问题解决的方法 关键控制台API函数:SetConsoleCtrlHandler 在支持C++ 11以上的编译器中,你可以这么做。 SetConsoleC...
    99+
    2024-04-02
  • vc控制台程序关闭事件时的处理方式是什么
    本篇内容介绍了“vc控制台程序关闭事件时的处理方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!关键控制台API函数:SetConso...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作