如何在应用程序出口执行命令

C++ - How to execute a command on application exit?

本文关键字:执行 命令 出口 应用程序      更新时间:2023-10-16

我对c++非常陌生,最近开始了一个项目,我需要访问一个设备,收集某些数据并将其转发到本地网络上的数据流。

虽然我的应用程序做了所有需要的事情,但它缺少一个功能:当我关闭运行应用程序的窗口时,它不会停止硬件设备。结果是,每次完成程序后,我都必须进行一次硬件重置。这不仅不方便,而且不可能实现程序的预期用途。

我基本上只是想设置一个回调函数,即执行,当程序关闭时(通过点击x,按Alt-F4等)

这可能吗?为这些事件创建处理程序的可能性:

BOOL WINAPI ConsoleHandler(DWORD dwCtrlEvent)
{
    switch (dwCtrlEvent)
    {
    case CTRL_CLOSE_EVENT:
        // something
    case CTRL_SHUTDOWN_EVENT:
        // the same?
    default:
        return FALSE;
    }
}

如果这是一个正确的方法,我想知道如何使用这个处理程序?我需要在我的程序中创建这样的处理程序并且不断更新吗?

我很感激任何帮助乔纳斯

在这种情况下,正确使用RAII会对您有所帮助。

这基本上是说将资源所有权包装在对象内部。然后,您可以在程序开始时创建一个对象,并在程序结束时清理任何资源:

struct DeviceManager
{
     DeviceManager() { InitDevice(); }
     ~DeviceManager() { DecativateDevice(); }
};
DeviceManager dm;  //namespace scope, single translation unit

dm将在程序启动时初始化,在进入main()之前,并在程序结束时释放。

有一个标准库函数atexit,它允许您注册一个回调,以便在程序正常退出时调用。

要处理异常终止,可以使用异常处理程序。简单的try{}/catch{}块,在catch{}中或之后加上处理代码,对于大多数简单的程序应该足够了。对于高级设置,请参阅此处的结构化异常处理。

虽然您可以为各种关闭事件放入特殊处理程序,但您应该考虑以更面向对象的方式设计资源控制,使用所谓的RAII(资源获取即初始化)。这种设计模式涉及到有这样一个类,它的创建初始化底层设备,它的析构函数关闭并清理底层设备。因此,无论如何销毁该类的所有者,设备都将被关闭。

我将确保我的项目分为硬件驱动程序,保持硬件处于同一状态,以及向用户呈现数据的用户界面。

这样,当用户界面关闭时,驱动程序继续运行,清理,然后才结束。这也适用于UI被强制关闭时,例如在系统关闭时,或使用任务管理器时。

您可能需要查看UMDF以获取更多细节。