我在Windows 7上有一个命令行应用程序。它主要由一个无限循环组成。当我单击命令行控制台窗口的关闭按钮时,它似乎立即被杀死。但是,我在析构函数中关闭了 SQLite 数据库连接,因此我担心 databse 可能已损坏。即使没有,我也希望能够正确终止我的对象(也许是通过向文件写入某些内容、日志记录等)。
我可以以某种方式确保调用我的析构函数吗?如果我关闭窗口,究竟会发生什么?有没有一种"更软"的方式来关闭程序?
控制台应用程序没有要求您退出的消息循环,但 Windows 使你能够注册函数以接收可能需要处理的一些通知。其中之一是关闭通知。
首先声明一个函数,Windows将使用HandlerRoutine给出的原型为此目的调用该函数:
BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType) {
if (CTRL_CLOSE_EVENT == dwCtrlType) {
return TRUE;
}
return FALSE;
}
现在,在开始循环之前,使用 SetControlCtrlHandler 注册该函数:
int main(int argc, char* argv[])
{
if (FALSE == SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE)) {
// Cannot register your handler? Check GetLastError()
}
while (true)
{
// This is your loop
}
return 0;
}
这就完成了。您可以显式删除要释放的对象,或者只是设置一个将打破无限循环的标志。
请注意,您将收到更多事件(Windows关机CTRL_SHUTDOWN_EVENT
,用户注销CTRL_LOGOFF_EVENT
,用户中断CTRL_C_EVENT
,关闭CTRL_CLOSE_EVENT
),处理您需要/想要的内容。