我在Windows 7上有一个命令行应用程序。它主要由无限循环组成。当我点击命令行控制台窗口的关闭按钮时,它似乎立即被杀死。但是,我在析构函数中关闭了SQLite数据库连接,因此我担心数据库可能已损坏。即使没有,我也希望能够正确终止我的对象(可能是通过写一些文件,记录等)。
我可以以某种方式确保我的析构函数被调用吗?如果我关上窗户会发生什么?是否有更软的"关闭程序的方法?
答案 0 :(得分:2)
控制台应用程序没有要求您退出的消息循环,但是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
),处理您需要的内容/想。