【问题标题】:How do I clear user input (cin) that occurred while the process was blocked?如何清除进程被阻止时发生的用户输入 (cin)?
【发布时间】:2014-06-09 11:53:47
【问题描述】:

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

Stack Overflow 上有各种问题解释了如何清除一行输入,但据我所知,他们倾向于假设“不需要的输入只持续到下一个换行符”之类的东西。在这种情况下,情况可能并非如此,因为用户可能会在应用程序被阻止时多次按 Enter。我尝试了多种方法(getline()get()readsome(),...),但它们通常似乎无法检测到 cin 何时暂时耗尽。相反,它们等待用户继续为 cin 提供内容。例如,如果我使用cin.ignore(n),那么不仅在打开 GUI 窗口时输入的所有内容都会被忽略,而且程序会在用户输入内容时一直等待,直到总共输入了 n 字符。这不是我想要的 - 我想根据字符出现的位置来忽略字符在时间中,而不是在输入流中它们出现的位置。

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

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

【问题讨论】:

  • 这是一个 XY 问题。解决真正的问题,不要让你的控制台像这样紧张。启动一个线程并让显示窗口。

标签: c++ input cin


【解决方案1】:

没有可移植的方式来实现您想要做的事情。你基本上需要将输入流设置为非阻塞状态,只要有字符就一直读下去。

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多