gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:15:54 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com