2010-02-25 136 views
2

有任何的方式来运行,只有从键盘 用户输入停止,不要求每个周期继续无限循环?在一个C程序 (我正在开发一个C聊天,用for(;;)循环读取条目,我只有在用户想要键入并发送消息时才需要停止它)。做,而在键盘输入的无限循环停止 - Visual C

+3

寻找'break'语句? –

+0

不,我认为他正在寻找一种方式来执行无阻塞读取stdin –

+0

没有我需要一个没有给每一次确认编辑:正确 – frx08

回答

6

没有指定的操作系统,所以我会承担一些POSIX兼容的操作系统。

您可以使用select。这可以用来阻塞一组文件描述符(在你的情况下,标准输入),有限的超时或不确定的阻塞。

我的猜测是,因为这是一个聊天程序,你也想这样做一些其他的文件描述符,像聊天TCP套接字。所以你可以在一个调用上测试输入。

在Windows控制台的情况下,你应该能够使用GetStdHandle和WaitForSingleObject的/ WaitForMultipleObjects的,如果选择不为你工作。

+0

它的Windows操作系统 – frx08

+0

Windows有一个POSIX兼容层并支持select()。 –

+0

@ frx08:如果是windows,是控制台吗?窗户gui?你也应该指定。 – 2010-02-25 00:28:50

2

有一些在Windows这样做的方法。假设你使用VC++,最简单的方法是使用_kbhit()。如果您想直接使用Win32 API,则可以调用GetNumberOfConsoleInputEvents()并查看返回值是否非零。

你也可以做一个重叠读,每次循环调用WaitForSingleObject,超时值为0.零等待表示无论是否有输入,它都会立即返回。返回值会告诉您是否有任何数据:WAIT_TIMEOUT表示尚未读取数据,WAIT_OBJECT0表示您有一些数据正在等待处理。

+0

如何在循环中使用kbhit()/ getch()从缓冲区中读取键之后重置stdin句柄从信号状态? –

+0

@techtonik:如果你打算使用句柄,你可能想要在整个过程中使用控制台功能。 –