我试图从closuresbutton被击中时从控制台应用程序的优雅退出。
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,并在控制台中input^ C,则允许主线程继续并正常退出。 有没有办法让主线程在控制台closures时正常退出?
我也试过使用std :: signal但是它是一样的。 适用于^ C,但不适用于窗户closures。
感谢乔纳森的提示。
我看到处理程序是在它自己的线程上调用的。 向ctrl_handler添加了“退出”标志的轮询。 诀窍吗? 有些时候你只能大声说出来才能看到答案。
bool done = false; bool exiting = false; BOOL ctrl_handler(DWORD event) { if (event == CTRL_CLOSE_EVENT) { done = true; while (!exiting) sleep(10ms); return TRUE; } return FALSE; } int main() { SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE); while (!done) do_stuff(); cleanup(); cout << "bye"; exiting = true; }