2010-02-25 131 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:如果你打算使用句柄,你可能想要在整個過程中使用控制檯功能。 –