網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
百度可以找到很多關(guān)于這個(gè)問(wèn)題解決的方法
關(guān)鍵控制臺(tái)API函數(shù):SetConsoleCtrlHandler
在支持C++ 11以上的編譯器中,你可以這么做。
SetConsoleCtrlHandler([](DWORD fdwctrltype)->BOOL { if (fdwctrltype == CTRL_CLOSE_EVENT) { // 你的善后代碼... return TRUE; } return FALSE; }, TRUE);
最初這么做是很舒服的,但之后發(fā)現(xiàn)了問(wèn)題:
Windows控制臺(tái)在標(biāo)記狀態(tài)下,printf之類的輸出函數(shù),會(huì)阻塞在標(biāo)記選擇時(shí)(點(diǎn)控制臺(tái)左上角-編輯-標(biāo)記)。
這就導(dǎo)致了,我們的善后代碼中,可能會(huì)死鎖,例如你要優(yōu)雅的結(jié)束一個(gè)線程,這個(gè)線程在最后的時(shí)候printf了。
線程里printf等待標(biāo)記狀態(tài),SetConsoleCtrlHandler回調(diào)函數(shù)里等待線程結(jié)束,總之就是死鎖。
我本來(lái)想著,去找到能夠獲取這種標(biāo)記狀態(tài)的控制臺(tái)API,但找了很久都沒有結(jié)果。
最后,我就考慮,有沒有方法讓printf不與標(biāo)記狀態(tài)發(fā)生死鎖,答案是: 輸出流重定向。
所以,代碼變成這樣:
SetConsoleCtrlHandler([](DWORD fdwctrltype)->BOOL { if (fdwctrltype == CTRL_CLOSE_EVENT) { char szbuf[0x1000]; setvbuf(stdout, szbuf, _IOFBF, 0x1000); // 你的善后代碼... return TRUE; } return FALSE; }, TRUE);
這么做之后,世界果然更美好了,如果最后這些日志信息對(duì)你來(lái)說(shuō)是重要的,那么你可能需要寫更多代碼去實(shí)現(xiàn)。
知識(shí)點(diǎn)擴(kuò)展:
實(shí)例:
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); //手工產(chǎn)生一事件 }
原文鏈接:https://www.cnblogs.com/babypapa/p/13032603.html
相關(guān)推薦
- 2022-10-12 常見Android編譯優(yōu)化問(wèn)題梳理總結(jié)_Android
- 2022-11-13 PyTorch模型的保存與加載方法實(shí)例_python
- 2022-05-17 springboot打包為jar
- 2022-10-30 系統(tǒng)應(yīng)用根據(jù)Uri授予權(quán)限方法詳解_Android
- 2022-05-21 Unity為軟件添加使用有效期的具體步驟_C#教程
- 2022-12-23 C++多線程之帶返回值的線程處理函數(shù)解讀_C 語(yǔ)言
- 2022-08-15 獲取當(dāng)月第一天和最后一天、獲取前月的最后一天
- 2022-04-14 Python中的flask框架詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支