【问题标题】:do while infinite loop stop on keyboard input - C在键盘输入上执行无限循环停止 - C
【发布时间】:2010-02-25 00:14:37
【问题描述】:

有任何方法可以运行仅在用户从键盘输入时停止的无限循环 不要求每个周期继续?在 C 程序中 (我正在开发一个 C 聊天,它使用 for(;;) 循环读取条目,只有当用户想要输入和发送消息时我才需要停止它)大家好!

【问题讨论】:

  • 正在寻找break 声明?
  • 不,我认为他正在寻找一种从标准输入执行非阻塞读取的方法
  • 不,我需要一个没有每次都确认的情况编辑:完全正确

标签: c input nonblocking


【解决方案1】:

您没有指定操作系统,所以我假设一些符合 POSIX 的操作系统。

您可以使用select。这可用于以有限超时或无限期阻塞来阻塞一组文件描述符(在您的情况下为标准输入)。

我的猜测是,由于这是一个聊天程序,您还希望在其他文件描述符上执行此操作,例如您的聊天 tcp 套接字。因此,您可以使用 one 调用来测试两者的输入。

在 windows 控制台的情况下,如果 select 不适合您,您应该能够使用 GetStdHandle 和 WaitForSingleObject/WaitForMultipleObjects。

【讨论】:

  • Windows 有一个 POSIX 兼容层并支持 select()。
  • @frx08:如果是windows,是控制台吗? windows gui?你也应该指定。
  • 在 windows 控制台的情况下,您应该可以使用 GetStdHandle 和 WaitForSingleObject。
【解决方案2】:

在 Windows 中有多种方法可以做到这一点。假设您使用的是 VC++,最简单的方法可能是使用_kbhit()。如果你想直接使用 Win32 API,你可以调用GetNumberOfConsoleInputEvents() 看看返回是否非零。

您也可以进行重叠读取,每次循环调用WaitForSingleObject,超时值为0。零等待意味着无论有没有输入,它都会立即返回。返回值会告诉你是否有数据:WAIT_TIMEOUT 表示尚未读取数据,WAIT_OBJECT0 表示有数据等待处理。

【讨论】:

  • 在循环中使用 kbhit()/getch() 从缓冲区读取密钥后,如何从信号状态重置标准输入句柄?
  • @techtonik:如果您要使用手柄,您可能希望始终使用控制台功能。
猜你喜欢
  • 2017-06-20
  • 2015-02-04
  • 2015-04-08
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多