【问题标题】:using c++ input stream cin without blocking使用 c++ 输入流 cin 不阻塞
【发布时间】:2016-07-25 03:48:00
【问题描述】:

我正在尝试使用 c++ 标准输入流 cin 来获取用户输入,而不会阻止程序的执行。我有这个代码:

char ch;
int flag=1;

do
{
   if(cin.rdbuf()->in_avail())
   {
       cin.get(ch);
       flag=0;
   }
   else
       //do something else
}while(flag);

//do something with the input

这里的想法是在做其他事情时等待用户输入而不阻塞,一旦用户提供输入,我们就会处理输入(全部在一个线程中)。我从文档中知道输入流使用的 streambuf 类提供了 in_avail() 函数,当缓冲区中有输入就绪时,该函数将返回一个非零值。上面的代码没有像我预期的那样工作,即使我在某个时候提供了键盘输入,它也会永远循环。我在 Windows 7 中使用 MS Visual Studio 2005。我在这里缺少什么?

【问题讨论】:

  • in_avail 没有做你想做的事。仅使用标准 C++ 库除非您愿意处理多个线程,否则无法做您想做的事情。
  • @n.m 你能解释一下为什么 in_avail 在这种情况下不做我想做的事吗?
  • in_avail 处理 buffer(streambuf 中的“buf”)。它告诉您有多少已被输入数据填充但尚未消耗。缓冲区不是用魔法填充的,它是通过调用读取操作来填充的。此操作会阻塞。
  • @n.m 谢谢。明白了。

标签: c++ iostream istream


【解决方案1】:

函数in_avail 做了:

返回获取区域中可用的字符数。

即使某些字符可以从底层操作系统缓冲区读取,get 区域也可能为空。

当您在 streambuf 上有效调用读取操作时,您将触发获取区域的重新填充。该操作将阻塞。原因是负责填充get区域的方法underflow

确保输入区域中至少有一个字符可用

为了确保这一点,它必须阻塞直到某个字符被读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多