我在一些地方看过一两次,但我在搜索时似乎无法找到这种模式。我想要的是,在循环中,为用户输入暂停几毫秒,然后继续。
所以它看起来像这样:
int main()
{
while (1)
{
//do stuff
//get user input, continue if there is nothing
//do stuff based off of user input
}
}
我在Fedora 18上使用xemacs和g ++,我正在寻找单键盘按键。
答案 0 :(得分:1)
你(几乎可以肯定)想要使用curses库。
如果要暂停等待输入,请调用halfdelay
设置等待输入的时间。如果用户在那段时间内没有输入任何内容,它将返回ERR
(或者反正一些错误代码 - 已经有一段时间了,所以我不记得是什么)。但是,如果存储器有效,则可以指定的最短延迟是1/10 th 秒;没有办法告诉它只是暂停(比如说)最多2毫秒。编辑:考虑一下,似乎有一个timeout
(或类似的东西)可以让你设置超时(以毫秒为单位)。
更常见的情况是,如果有的话,你只想对输入作出反应,如果没有,则继续进行其他处理。在这种情况下,您可以拨打nodelay
。
无论哪种方式,您还希望调用cbreak
以禁用操作系统级别的行缓冲,因此用户按下的任何键将立即可供程序使用,而不是等待他们在您收到之前按回车键输入
我猜你可能也想调用noecho()
,因此用户的输入不会被getch
回显。对于您似乎正在谈论的那种程序,很少需要回显输入命令。
然后在你的循环中,你将调用getch()
来获取密钥输入数据(如果有的话)。如果您获得输入,则进行处理。如果它返回错误代码以指示没有输入,则继续进行其他处理。
所以代码的结构类似于:
cbreak();
noecho();
nodelay(mywindow, true);
while (1) {
int ch;
if (ERR != (ch = getch()))
process(ch);
update_screen();
do_other_processing();
}
答案 1 :(得分:0)
如果想要键盘输入,然后仅在它出现时触发触发器,最好的办法是使用事件处理程序样式系统,类似于游戏检测输入的方式。会发生什么通常是这样的:
Event e;
while(Poll for event e) // Basically check if something has been triggered.
{
if(event type == certain key pressed){
// Do related stuff
}
}
你基本上将它放在主程序循环中,并且每次触发你指定的键或其他触发器时,它都会调用一个函数或执行你指定的其他操作。