【问题标题】:C++ - How to execute a command on application exit?C++ - 如何在应用程序退出时执行命令?
【发布时间】:2014-08-04 15:49:09
【问题描述】:

我是 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;
    }
}

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

感谢您的帮助 乔纳斯

【问题讨论】:

  • 它是特定于操作系统的(但您忘记了 Windows 标签)。也许atexit(3) 可能有用,如果您的操作系统(和 C 库)提供它。
  • 这是一个终端/控制台程序吗?或者你有图形用户界面吗?视觉工作室?

标签: c++ winapi eventhandler application-close function-exit


【解决方案1】:

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

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

struct DeviceManager
{
     DeviceManager() { InitDevice(); }
     ~DeviceManager() { DecativateDevice(); }
};

DeviceManager dm;  //namespace scope, single translation unit

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

【讨论】:

    【解决方案2】:

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

    要处理异常终止,您可以使用异常处理程序。简单的 try{}/catch{} 块以及 catch{} 中或之后的处理代码应该足以满足大多数简单程序的需要。有关高级设置,请参阅结构化异常处理here

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我会确保我的项目被拆分为硬件驱动程序,保持硬件处于正常状态,以及将数据呈现给用户的用户界面。

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

        您可能想查看UMDF 了解更多详情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-06
          • 1970-01-01
          • 2011-03-09
          • 2013-09-04
          • 2012-03-16
          • 1970-01-01
          • 2013-12-09
          • 2012-08-29
          相关资源
          最近更新 更多