输出时异步 Windows 控制台输入
Posted
技术标签:
【中文标题】输出时异步 Windows 控制台输入【英文标题】:Asynchronous Windows Console input whilst outputting 【发布时间】:2009-06-06 15:38:16 【问题描述】:我在尝试在输出的同时读取输入时遇到问题。我的游戏需要一个服务器控制台,它可以在输出的同时接收输入并且不会弄乱缓冲区。
例如,我正在输入“Hello world”,在此过程中,玩家死亡、击杀等被输出到控制台,这将导致如下结果:
Hello *Player kill Player2*world
提前致谢
【问题讨论】:
【参考方案1】:与其直接将输出写入控制台,不如生成一个 GUI 窗口?
然后,只有一个用于输出的区域,在底部有一个单独的输入区域,您可以在其中键入命令。有点像 irc 客户端的外观。
如果它只能是控制台,我建议使用类似 ncurses(或 PDCurses)的东西来创建基于文本的界面。
【讨论】:
【参考方案2】:不用考虑太多,在我看来,您要么需要一个非阻塞输入例程用于标准输入,例如 getch(),但如果没有要读取的内容则返回,您在循环中调用它同时也在处理输出,或者你需要两个线程:一个读,一个写。
【讨论】:
输入例程是非阻塞的,因此输出出现在您输入时输入的位置。看我的例子,斜体是我输入“Hello world”时输出的内容 您可以使用某种同步和阻塞/缓冲一种,而另一种正在发生,或者只是使用两个不同的区域进行输入和输出。我强烈建议您采纳@AsLanFromNarnia 的建议并选择后者。【参考方案3】:你自己开发控制台,所以这应该不是什么大问题。
控制台基本上是一组正在呈现的文本行。回显用户输入,以便用户看到他正在输入的内容。这意味着控制台的最后一行是特殊的,它是“可编辑输入缓冲区”。输出所有其他行。当用户点击Enter
时,您执行编辑缓冲区。执行中的第1步是制作编辑缓冲区的私有副本,第2步是清除编辑缓冲区,第3步是将私有副本复制到输出。
因此,在任何时候都只有一个部分行,并且它只会根据用户输入而改变。所有其他行都是完整的,并且逐行更改。您的程序日志记录发生在两个用户输入之间,因此有自己的行。在多线程程序中,这意味着“Console::AddLine”函数将需要一个内部互斥体(Win32 为 CriticalSection)。
【讨论】:
【参考方案4】:听起来您需要在代码和控制台之间设置一个层。创建一个执行所有控制台 I/O 的包装器对象。当有人调用它的 WriteLine 方法时,包装器应该擦除当前显示的输入(如果有),写入该行,然后在其下方再次写入输入。
【讨论】:
以上是关于输出时异步 Windows 控制台输入的主要内容,如果未能解决你的问题,请参考以下文章