網站首頁 編程語言 正文
百度可以找到很多關于這個問題解決的方法
關鍵控制臺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); //手工產生一事件 }
原文鏈接:https://www.cnblogs.com/babypapa/p/13032603.html
相關推薦
- 2022-02-16 mac 使用launchctl 開機時加速vim、emacs
- 2022-09-30 react中useState使用:如何實現在當前表格直接更改數據_React
- 2022-01-16 對象的綁定、滾輪滾動事件及鍵盤事件
- 2022-08-01 OpenCV連通域數量統計學習示例_python
- 2022-06-01 Python讀取csv文件做K-means分析詳情_python
- 2022-09-20 Python處理時間戳和時間計算等的腳本分享_python
- 2022-10-13 Python變量教程之全局變量和局部變量_python
- 2022-03-03 MacOS git pull / git clone Enter passphrase for ke
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支