使用 C++ 输入流 CIN 而不会阻塞

using c++ input stream cin without blocking

提问人:Biruk Abebe 提问时间:4/5/2016 最后编辑:Biruk Abebe 更新时间:4/5/2016 访问量:2925

问:

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

C++ IOstream istream

评论

2赞 Pierre 4/5/2016
非阻塞控制台输入 C++ 的可能重复
3赞 n. m. could be an AI 4/5/2016
in_avail不会做你想做的事。除非您愿意处理多个线程,否则无法仅使用标准 C++ 库来执行您想要的事情。
0赞 Biruk Abebe 4/5/2016
@n.M,你能解释一下为什么在这种情况下in_avail不做我想做的事吗?
1赞 n. m. could be an AI 4/5/2016
in_avail处理缓冲区(streambuf 中的“buf”)。它告诉您输入数据填充了多少数据,但尚未消耗。缓冲区不是用魔术填充的,而是通过调用读取操作来填充的。此操作将阻止。
0赞 Biruk Abebe 4/5/2016
@n.m 谢谢。明白了。

答:

2赞 fjardon 4/5/2016 #1

该函数in_avail执行以下操作:

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

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

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

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

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