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

时间:2016-05-24 08:45:29

标签: c++ console exit

我在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())一直在后台运行,因为我还没有初始化库。因为我必须不断监视输入引脚的状态,所以我在代码中使用了while(1),因为控件没有到达deInitLibrary();并且没有对库进行初始化。因此,当我下次运行应用程序时,导致应用程序性能下降。

我想包括一个scanf()来扫描一个特定的角色,这样当它被接收时,我可以轻松地从while(1)中断开并对libray进行初始化以安全退出。但是scanf不是一种正确的方法,因为控件在scanf处停止并且不会从此处移动,直到它扫描一个字符。

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

1 个答案:

答案 0 :(得分:0)

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
        }
    }
}