如何在 while(1) 内部工作时安全退出 C++ 控制台应用程序

How to safely exit C++ console application while working inside while(1)

我正在 Toradex processor 上使用 Visual C++ 开发 Windows Embedded 7。在我的应用程序中,我必须监视输入引脚的状态并相应地执行功能。要使用引脚,我必须初始化一个库。所以代码如下所示:

int wmain()
{
  initLibrary();    //Initialize library

  //some code

  while(1)
  {  
    if(input1==High)
    {
     //perform some actions
    }
    if(input2==High)
    {
     //perform some actions
    }
  }

  deInitLibrary();    //de intialize the library
}

以上代码效果很好。但是当我退出应用程序时会发生什么,我在代码开始时初始化的库 (initLibrary()) 在后台保持 运行ning 因为我没有取消初始化库。因为我必须持续监控输入引脚的状态,所以我在代码中使用了 while(1),因此控件没有达到 deInitLibrary(); 并且没有取消初始化库。因此导致应用程序在我下次 运行 时性能缓慢。

我想包括一个 scanf() 来扫描一个特定的字符,这样当它被接收到时,我可以很容易地从 while(1) 中断并取消初始化库以安全退出。但是 scanf 不是正确的方法,因为控件在 scanf 处停止并且在扫描一个字符之前不会从这里移动。

有没有什么办法可以让在后台扫描char 运行s并且不干扰主代码,并且每当收到一个char时,它就会从while循环中跳出以取消初始化并退出应用。正确退出应用程序的其他方法是什么?

RAII是你的朋友。

将您的 init/uninit 包裹在一个保证在其范围结束时被破坏的对象中。

示例:

class Initializer
{
public:
    Initializer()
    {
        initLibrary();
    }

    ~Initializer()
    {
        deInitLibrary();
    }
};

int wmain()
{
    Initializer init;

    while (1)
    {
        if (input1 == High)
        {
            //perform some actions
        }
        if (input2 == High)
        {
            //perform some actions
        }
    }

    // init will go out of scope and call deInitLibrary()
}

如果你想要一个更通用的解决方案,你可以这样做:

class Finally
{
public:
    // you can choose to use std::function instead
    typedef void(*Functor)();

    Finally(Functor functor) : functor_(functor) {}
    ~Finally() { functor_(); }

private:
    Functor functor_;
};

int wmain()
{
    initLibrary();    //Initialize library

    //some code

    Finally finally(&deInitLibrary);

    while (1)
    {
        if (input1 == High)
        {
            //perform some actions
        }
        if (input2 == High)
        {
            //perform some actions
        }
    }
}