簡體   English   中英

關閉控制台窗口時優雅退出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM