[英]Graceful exit when closing console window
當關閉按鈕時,我正試圖從控制台應用程序中正常退出。
bool done = false;
BOOL ctrl_handler(DWORD event)
{
if (event == CTRL_CLOSE_EVENT) {
done = true;
return TRUE;
}
return FALSE;
}
int main()
{
SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE);
while (!done)
do_stuff();
cleanup();
cout << "bye";
}
我的處理程序被正確調用,但主線程之后沒有恢復,所以“再見”永遠不會發生。 如果我改為捕獲CTRL_C_EVENT並在控制台中點擊^ C,則允許主線程繼續並正常退出。 有沒有辦法讓主線程在控制台關閉時正常退出?
我也嘗試過使用std :: signal,但它是一樣的。 適用於^ C但不適用於窗口關閉。
謝謝喬納森的小費。
我看到處理程序是在它自己的線程上調用的。 如果處理程序返回,則整個進程被強制退出,因此我們需要給主線程時間自行退出。
bool done = false;
BOOL ctrl_handler(DWORD event)
{
if (event == CTRL_CLOSE_EVENT) {
done = true;
Sleep(20000); // force exit after 20 seconds
return TRUE;
}
return FALSE;
}
int main()
{
SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE);
while (!done)
do_stuff();
cleanup();
cout << "bye";
}
我認為更好的方法是使用:
if (event == CTRL_CLOSE_EVENT)
{
ExitThread(0);
// return TRUE; // warning C4702: unreachable code
}
ExitThread
將終止調用ctrl_handler
的線程。 這樣就不會調用ExitProcess
,你的主線程將能夠執行所有需要的清理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.