- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Toradex 处理器
上使用 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 循环中跳出以取消初始化并退出应用程序。正确退出应用程序的其他方法是什么?
最佳答案
RAII是你的 friend 。
将您的 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
}
}
}
关于c++ - 如何在 while(1) 内部工作时安全退出 C++ 控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408503/
我正在尝试在现有的 Angular 项目中安装 AWS Amplify。我将 Cognito 用户池与 Cognito 联合身份一起使用。我可以登录,但是当我尝试调用我的 API 时,我收到消息 {"
我有一个 AWS 托管的 Elasticsearch 服务(比如 smallES),它附加了一个正常工作的 S3 存储桶,其中包含过去 1 年的逐日滚动索引。出于某种商业原因,我创建了另一个 AWS
我是一名优秀的程序员,十分优秀!