91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vc控制臺程序關閉事件時的處理方式是什么

發布時間:2021-12-06 09:01:48 來源:億速云 閱讀:162 作者:iii 欄目:開發技術

本篇內容介紹了“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控制臺程序關閉事件時的處理方式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vc
AI

水富县| 凤山市| 西城区| 定襄县| 延长县| 海门市| 大竹县| 定日县| 台北县| 乌苏市| 墨竹工卡县| 永丰县| 郑州市| 南和县| 资讯| 紫阳县| 湖州市| 安徽省| 青铜峡市| 大竹县| 辽中县| 遵义县| 卢龙县| 织金县| 乃东县| 汉阴县| 惠水县| 大姚县| 河北区| 承德县| 张家川| 高淳县| 阿拉善左旗| 铜梁县| 铜川市| 革吉县| 西林县| 南溪县| 凤凰县| 陆河县| 周宁县|