【问题标题】:Asynchronous Windows Console input whilst outputting输出时异步 Windows 控制台输入
【发布时间】:2009-06-06 15:38:16
【问题描述】:

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

例如,我正在输入“Hello world”,在此过程中,玩家死亡、击杀等被输出到控制台,这将导致如下结果:

Hello *Player kill Player2*world

提前致谢

【问题讨论】:

    标签: c++ windows winapi console


    【解决方案1】:

    与其直接将输出写入控制台,不如生成一个 GUI 窗口?

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

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

    【讨论】:

      【解决方案2】:

      不用考虑太多,在我看来,您要么需要一个非阻塞输入例程用于标准输入,例如 getch(),但如果没有要读取的内容则返回,您在循环中调用它同时也在处理输出,或者你需要两个线程:一个读,一个写。

      【讨论】:

      • 输入例程是非阻塞的,因此输出出现在您输入时输入的位置。看我的例子,斜体是我输入“Hello world”时输出的内容
      • 您可以使用某种同步和阻塞/缓冲一种,而另一种正在发生,或者只是使用两个不同的区域进行输入和输出。我强烈建议您采纳@AsLanFromNarnia 的建议并选择后者。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-11
          • 1970-01-01
          • 2019-08-20
          相关资源
          最近更新 更多