如何在 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
}
}
}
我正在 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
}
}
}