如何在用户按下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
}
我熟悉SIGINT和其他终止信号。这是否类似? – Koronakesh
@Koronakesh是的,它们在概念上是相同的,除了'SetConsoleCtrlHandler'提供了更多的功能并且是特定于平台的。 – Dai