C ++,如何使用键盘输入控制程序流程
Posted
技术标签:
【中文标题】C ++,如何使用键盘输入控制程序流程【英文标题】:C++, how to control program flow with keyboard input 【发布时间】:2011-03-05 12:13:24 【问题描述】:我有一个无限循环的主程序。通过使用键盘输入更改布尔变量,我希望能够控制是否调用该循环中的某些 if 语句。我找到了这个帖子:C non-blocking keyboard input, 但是对于看似基本的功能来说,它似乎过于费力和复杂。有没有更简单的方法?
【问题讨论】:
键盘输入不是 C 或 C++ 的特性,而是 OS API 的特性。你的目标是什么操作系统? @Merlyn:理想情况下,它应该是 mac-OS 10.5.7 和 Ubuntu 的跨平台,但如果这不可能,Ubuntu 是我的主要目标。 【参考方案1】:您必须使用 OS/Firmware/Framework/environment API 来获取输入事件,或者使用为您执行此操作的库。无论如何,在 C++ 中没有内置的方法。
我经常在游戏中使用OIS。它是跨平台的且易于使用。不确定它对游戏以外的其他情况是否有用,但它可以为您完成工作。
【讨论】:
@Klaim:看起来很酷,知道每次迭代会增加多少计算时间吗? 不知道,但这取决于您使用的是什么。首先,了解在 Windows 上它使用 directx8(无论如何默认安装)来获取输入信息,因此它间接从驱动程序检索信息。现在您可以通过两种方式访问输入信息:直接通过获取输入设备(鼠标、键盘等)的当前状态并手动检查(使用循环中的 ifs)或通过使用观察者模式并仅提供“ listener”对象,它将接收输入事件。我想事件方式更灵活,但如果您只想检查精确状态,则成本更高。 但是,我建议您不必关心成本:它用于游戏中,因此您可以猜测它对于大多数应用程序来说已经足够快了,包括 cpu 密集型应用程序(如游戏)。无论如何,您现在甚至不应该问,因为输入管理肯定永远不会成为您的性能瓶颈。不要悲观,先让你的应用运行,然后检查是什么导致它的性能下降,然后修复它。 @Klaim:好的。好吧,我将它用于遗传算法,我每秒进行很多次迭代并且代码行数相对较少,所以我倾向于担心每一件小事。 @Matt,在这种情况下,为什么不每(比如)1000 次迭代检查一次输入? (显然,这取决于迭代的速度。)【参考方案2】:SDL 库是实现跨平台的一种方式。这是an example of polling keyboard events。
【讨论】:
你知道包含这个库的计算开销吗? 不,不是,但它是为在游戏中使用而设计的,通常认为效率非常重要。【参考方案3】:把主程序放在一个线程中,然后有类似的东西
static char mode = ' ';
while(mode != 27) // to allow Esc to end program
mode = _getch();
然后,线程代码可以根据按下的键执行不同的操作。
【讨论】:
我从来没有做过线程编程。这本身是另一个项目吗?它会显着增加计算需求吗? 是的,学习线程需要一些工作。另一种方法是将另一个库集成到您的应用程序中,这也需要一些时间/精力。我认为这种方法不会减慢您的程序速度。 酷,谢谢。似乎是一个很酷的选择,尤其是如果它更快的话。您知道改用库(在计算上)可能会减慢多少速度吗?以上是关于C ++,如何使用键盘输入控制程序流程的主要内容,如果未能解决你的问题,请参考以下文章