3

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

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

我很感谢乔纳斯的任何帮助

4

4 回答 4

8

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

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

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

DeviceManager dm;  //namespace scope, single translation unit

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

于 2014-08-04T15:52:59.487 回答
1

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

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

于 2014-08-04T23:04:29.193 回答
0

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

于 2014-08-04T15:54:53.230 回答
0

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

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

您可能需要查看UMDF以了解更多详细信息。

于 2014-08-04T15:56:26.930 回答