如何清除进程被阻止时发生的用户输入(cin)?

时间:2014-06-09 11:53:47

标签: c++ input cin

我有一个C ++程序,它从std::cin上的用户那里获取输入。在某些时候,它需要调用一个函数来打开一个用户可以与之交互的GUI窗口。此窗口打开时,我的应用程序被阻止。我注意到如果用户在我的应用程序窗口中输入任何内容而另一个窗口是打开的,那么没有任何事情立即发生,但是当控制权返回到我的应用程序时,那些键击都会立即被执行。这是不可取的。我希望在阻止应用程序时输入的所有键击都被忽略;或者,一种在应用程序重新获得控制权时丢弃所有内容的方法,但保留对之后发生的击键作出反应的能力。

Stack Overflow上有各种各样的问题可以解释如何清除一行输入,但据我所知,他们倾向于认为“不需要的输入只会持续到下一个换行符”。在这种情况下可能不是这样,因为用户可以在应用程序被阻止时多次按Enter键。我尝试了各种方法(getline()get()readsome(),...)但是他们通常似乎没有检测到cin暂时用尽的时候。相反,他们等待用户继续提供cin的内容。例如,如果我使用cin.ignore(n),那么不仅在GUI窗口被忽略时输入所有内容,而且程序在用户输入内容之后仍在等待,直到输入了总共n个字符为止。这不是我想要的 - 我想忽略基于及时发生位置的字符,而不是输入流中的

现在用“排除所有在cin 中的所有东西,然后停止寻找更多东西”的成语是什么?我不知道该搜索什么来解决这个问题。

我看到了this question,它可能类似且有答案,但答案要求使用<termios.h>,这在Windows上无法使用。

1 个答案:

答案 0 :(得分:1)

没有可移植的方式来实现您想要做的事情。您基本上需要将输入流设置为非阻塞状态,并且只要有任何字符就继续读取。

get()getline()将阻塞,直到有足够的输入来满足请求。 readsome()仅处理流的内部缓冲区,仅用于非阻塞地提取已从流内部缓冲区读取的内容。

在POSIX系统上,您只需将O_NONBLOCK设置为fcntl()并将read()保留为文件描述符0,直到读取返回值<= 0(如果它小于0有错误;否则没有输入)。由于操作系统通常在控制台上缓冲输入,因此您还需要将流设置为非规范模式(使用tcsetattr())。完成后,您可能会恢复原始设置。

如何在非POSIX系统上做类似的事情,我不知道。