長時間讀者,第一次海報:D異步Windows控制檯輸入,同時輸出
我有問題試圖讀取輸入,同時輸出。我需要一個服務器控制檯用於我的遊戲,它可以在輸出時接收輸入,而不會弄亂緩衝區。
例如,我打字的「Hello world」,並在這個過程中,玩家死亡,殺死等被輸出到控制檯,這將導致類似:
你好*播放器殺死Player2 *世界
在此先感謝
長時間讀者,第一次海報:D異步Windows控制檯輸入,同時輸出
我有問題試圖讀取輸入,同時輸出。我需要一個服務器控制檯用於我的遊戲,它可以在輸出時接收輸入,而不會弄亂緩衝區。
例如,我打字的「Hello world」,並在這個過程中,玩家死亡,殺死等被輸出到控制檯,這將導致類似:
你好*播放器殺死Player2 *世界
在此先感謝
,而不是直接將輸出寫入到控制檯,爲什麼不產生一個GUI窗口?
然後,只需要一個輸出指向的區域和一個單獨的輸入區域,您可以在其中鍵入命令。有點像irc客戶端的樣子。
如果它只是控制檯,我會建議使用類似ncurses(或者PDCurses)來創建一個基於文本的界面。
沒有想太多這個,在我看來你或者需要一個非阻塞的輸入例程,像getch(),但只是返回,如果沒有什麼可讀的,你在一個循環中調用,同時也處理輸出,或者你需要兩個thiaeds:一個讀取,一個寫入。
您正在開發自己的控制檯,所以這應該不是什麼大問題。
控制檯基本上是一組正在渲染的文本行。用戶輸入被回顯,以便用戶看到他正在輸入。這意味着控制檯的最後一行是特殊的,它是「可編輯的輸入緩衝區」。所有其他行都輸出。當用戶點擊Enter
時,您執行編輯緩衝區。執行中的第1步是編輯緩衝區的私人副本,第2步是清除編輯緩衝區,第3步是將私人副本複製到輸出。
因此,在任何時候只有一個部分線,它只是由用戶輸入而改變。所有其他線路都已完成,並逐行進行更改。你的程序記錄發生在兩個用戶輸入之間,因此會得到它自己的一行。在多線程程序中,這意味着「Console :: AddLine」函數將需要一個內部互斥體(CriticalSection for Win32)。
聽起來你需要在代碼和控制檯之間有一層。創建一個執行所有控制檯I/O的包裝器對象。當有人調用它的WriteLine方法時,包裝器應該擦除當前顯示的輸入(如果有的話),寫下該行,然後再次將輸入寫入下面。
輸入例程是非阻塞的,因此輸出會出現在您輸入的地方。看到我的例子,斜體是在輸入「Hello world」時輸出的內容 – Saul 2009-06-06 20:05:11