使用c ++输入流cin而不阻塞

时间:2016-04-05 09:31:20

标签: c++ iostream istream

我正在尝试使用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。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

函数in_avail执行:

  

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

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

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

  

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

为了确保这一点,它必须阻止,直到读取一些字符。