当关闭按钮被击中时,我正在尝试从控制台应用程序中优雅地退出。
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";
}我的处理程序被正确地调用,但是主线程之后不会继续,所以"bye“永远不会发生。如果我捕获CTRL_C_EVENT并在控制台中命中^C,那么主线程允许继续并优雅地退出。是否有办法允许主线程在控制台关闭时优雅地退出?
我也尝试过使用std::signal,但是它是一样的。适用于^C,但不适用于关闭窗口。
发布于 2015-02-19 00:32:11
谢谢乔纳森的提示。
我看到处理程序在它自己的线程上被调用。如果处理程序返回,则整个进程将被迫退出,因此我们需要给主线程时间自行退出。
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";
}发布于 2018-01-10 14:52:19
我认为更好的方法是使用:
if (event == CTRL_CLOSE_EVENT)
{
ExitThread(0);
// return TRUE; // warning C4702: unreachable code
}ExitThread将终止调用ctrl_handler的线程。这样就不会调用ExitProcess,并且您的主线程将能够执行所有所需的清理。
https://stackoverflow.com/questions/28596235
复制相似问题