输出时异步Windows控制台输入

时间:2009-06-06 15:38:16

标签: c++ windows winapi console

我在尝试同时输出时读取输入时遇到问题。我需要一个服务器控制台用于我的游戏,它可以在输出时接收输入而不会弄乱缓冲区。

例如,我正在键入“Hello world”,并且在此过程中,玩家死亡,杀戮等正在输出到控制台中,这将导致类似:

  

Hello * Player杀死了Player2 *世界

提前致谢

4 个答案:

答案 0 :(得分:4)

不是直接将输出写入控制台,为什么不生成GUI窗口?

然后,只有一个输出指向的区域,底部有一个单独的输入区域,您可以在其中键入命令。有点像irc客户端的外观。

如果它必须只是控制台,我建议使用像ncurses(或PDCurses)之类的东西来创建基于文本的界面。

答案 1 :(得分:1)

在不考虑这个问题的情况下,在我看来你或者需要stdin的非阻塞输入例程,比如getch(),但是如果没有什么要读的话就返回,你在循环中调用它同时也处理输出,或者你需要两个thraeds:一个读取,一个写入。

答案 2 :(得分:0)

你自己正在开发控制台,所以这应该不是什么大问题。

控制台基本上是一组正在渲染的文本行。用户输入被回显,因此用户看到他正在打字。这意味着控制台的最后一行是特殊的,它是“可编辑的输入缓冲区”。输出所有其他行。当用户点击Enter时,您执行编辑缓冲区。执行中的第1步是制作编辑缓冲区的私有副本,第2步是清除编辑缓冲区,第3步是将私有副本复制到输出。

因此,在任何时刻,只有一条局部线,它只会根据用户输入而改变。所有其他行都是完整的,并逐行更改。您的程序记录发生在两个用户输入之间,因此获得itws自己的行。在多线程程序中,这意味着“Console :: AddLine”函数将需要一个内部互斥锁(Win32的CriticalSection)。

答案 3 :(得分:0)

听起来你需要在代码和控制台之间加一层。创建一个执行所有控制台I / O的包装器对象。当有人调用其WriteLine方法时,包装器应擦除当前显示的输入(如果有),写入该行,然后再在其下面写入输入。