我有一个C++程序,它接受用户的输入std::cin.在某些时候,它需要调用一个函数来打开一个用户可以与之交互的GUI窗口.此窗口打开时,我的应用程序被阻止.我注意到如果用户在我的应用程序窗口中输入任何内容而另一个窗口是打开的,那么没有任何事情立即发生,但是当控制权返回到我的应用程序时,那些键击都会立即被执行.这是不可取的.我希望在阻止应用程序时输入的所有键击被忽略; 或者,一种在应用程序重新获得控制时丢弃它们的方法,但保留对在此之后发生的击键作出反应的能力.
Stack Overflow上有各种各样的问题可以解释如何清除一行输入,但据我所知,他们倾向于认为"不需要的输入只会持续到下一个换行符".在这种情况下可能不是这样,因为用户可以在应用程序被阻止时多次按Enter键.我已经尝试了各种方法(getline(),get(),readsome(),...),但他们通常时好像CIN是暂时耗尽不检测.相反,他们等待用户继续提供cin的内容.例如,如果我使用cin.ignore(n),那么不仅在GUI窗口被忽略时键入所有内容,而且程序在用户输入内容之后一直等待,直到n键入了总共字符.这不是我想要的 - 我想根据它们发生的时间而忽略字符,而不是它们在输入流中出现的位置.
什么是"废除现在所有的东西,然后停止寻找更多的东西" 的成语是什么?我不知道要搜索什么来解决这个问题.
我看到了这个问题,这可能是类似的并且有答案,但答案要求使用<termios.h>,这在Windows上是不可用的.
没有可移植的方法来实现您想要做的事情。您基本上需要将输入流设置为非阻塞状态,并只要有任何字符就继续读取。
get()并且getline()会一直阻塞,直到有足够的输入来满足请求。readsome()仅处理流的内部缓冲区,并且仅用于非阻塞地提取已从流内部缓冲区读取的内容。
在 POSIX 系统上,您只需从文件描述符 0设置O_NONBLOCKwithfcntl()和 keep ,直到读取返回一个值(如果它小于 0,则出现错误;否则没有输入)。由于操作系统通常缓冲控制台上的输入,因此您还需要将流设置为非规范模式(使用)。完成后,您可能会恢复原始设置。read()<= 0tcsetattr()
我不知道如何在非 POSIX 系统上进行类似的操作。