如何在用户按下C++控制台应用程序中的关闭按钮时执行程序清理?

问题描述:

因此,我已经在Visual Studio中开发了一个C++控制台应用程序,用信用卡读卡器记录出勤记录,然后吐出一个.csv文件。但是,由于该程序现在正在运行,用户必须手动键入“退出”才能成功关闭程序并生成.csv。如何在用户按下C++控制台应用程序中的关闭按钮时执行程序清理?

我知道非技术人员不会意识到这一点,只能点击X按钮并丢失数据。有什么方法可以捕捉信号并让程序执行清理工作并关闭?

这个程序已经是Windows了,所以这不是问题。

使用SetConsoleCtrlHandler为按下窗口标题关闭“X”按钮时引发的CTRL_CLOSE_EVENT事件设置回调。

注意,按Ctrl + Ç事件不同的是:这是CTRL_C_EVENT,但你处理它以同样的方式:Handle CTRL+C on Win32

#include <Windows.h> 

BOOL onConsoleEvent(DWORD event) { 

    switch(event) { 
     case CTRL_C_EVENT: 
     case CTRL_CLOSE_EVENT: 
      // do stuff 
      break; 
    } 

    return TRUE; 
} 

int main(int argc, char* argv[]) { 

    if(!SetConsoleCtrlHandler(onConsoleEvent, TRUE)) { 
     // die 
    } 

    // do stuff 
} 

这是针对Windows的,就像你说的,这不该这不是一个问题。

注意,您可以使用便携式signal功能,建立了SIGINT事件的处理程序(相当于按Ctrl + Ç),但是,据我所知,Windows的signal函数没有回调事件对应于X按钮,因此您必须使用SetConsoleCtrlHandler

#include <signal.h> // use `<cstdlib>` in C++ 

void onSigint(int value) { 
    // do stuff 
} 

int main(int argc, char* argv[]) { 

    signal(SIGINT, onSigint); 

    // do stuff 
} 
+0

我熟悉SIGINT和其他终止信号。这是否类似? – Koronakesh

+0

@Koronakesh是的,它们在概念上是相同的,除了'SetConsoleCtrlHandler'提供了更多的功能并且是特定于平台的。 – Dai