在循环内获取用户输入

时间:2014-02-11 20:23:08

标签: c++

我在一些地方看过一两次,但我在搜索时似乎无法找到这种模式。我想要的是,在循环中,为用户输入暂停几毫秒,然后继续。

所以它看起来像这样:

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 ++,我正在寻找单键盘按键。

2 个答案:

答案 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
    }
}

你基本上将它放在主程序循环中,并且每次触发你指定的键或其他触发器时,它都会调用一个函数或执行你指定的其他操作。