在开发控制台应用程序时经常会遇到一种情况,就是当点击关闭按钮时程序仍在处理一些任务,此时如果强制退出会导致任务处理异常。因此,程序需要响应点击关闭按钮的事件并等待当前任务处理完成。具体方法如下,这里用休眠10秒模拟任务,当点击关闭按钮后,每隔一秒钟检测一下任务是否正在运行。
using namespace std;
BOOL bTaskRunning = FALSE;
BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
while (TRUE)
{
bTaskRunning = TRUE;
Sleep(10 * 1000);
bTaskRunning = FALSE;
}
SetConsoleCtrlHandler(ConsoleCtrlHandler, FALSE);
}
return nRetCode;
}
BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
{
BOOL bFlag = TRUE;
while (bTaskRunning)
{
if (bFlag)
{
_tprintf(_T("Waiting for task exit ...\n"));
bFlag = FALSE;
}
Sleep(1000);
}
return TRUE;
}
return FALSE;
}