c++ - 无阻塞地使用c++输入流cin

标签 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。我在这里缺少什么?

最佳答案

函数in_avail做:

Returns the number of characters available in the get area.

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

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

Ensures that at least one character is available in the input area

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

关于c++ - 无阻塞地使用c++输入流cin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36422367/

相关文章:

C++ - bind() 失败

c++ - 如何在 cout 上使用 isatty(),或者我可以假设 cout == 文件描述符 1?

c++ - 动态数组中的素数

c++ - C++ 如何确定重载运算符的参数?

java - COM 接口(interface) iStream 在哪个 DLL 中定义?

c++ - 链表删除

c++ - 这是什么宏?

c++ - 获取对 std::thread::_M_start_thread 的 undefined reference

c++ - Istream 最多消耗 N 个空白字符

c++ - 更有效的删除空格的方法