我在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循环中断开以初始化并退出应用程序。什么是正确退出应用程序的其他方法。
答案 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
}
}
}