c++终端应用程序并行输入和输出

c++ terminal application concurrent input and output

本文关键字:输出 输入 并行 终端 应用程序 c++      更新时间:2023-10-16

我正在尝试实现一个类似于聊天客户端的应用程序,在用户键入自己的消息时,消息可以到达该应用程序。

我将通过一个示例来解释我希望程序如何运行:在收到消息之前:

>user partial input

收到消息后:

>the new message
>user partial input(cursor is here)

相反,传入消息后自然发生的情况是:

>user partial input the new message
>(cursor is here)

在那之后,用户仍然可以使用退格删除他之前写的内容,但它不会显示在屏幕上,而且总体上用户界面混乱。

有没有什么方法可以在不使用ncurses的情况下实现所需的行为?

谢谢。

编辑:对不起,我忘了写我的环境是什么,是Cygwin。谢谢你的回答。

虽然ncurses可能是实现这一目标的最灵活、最简单的方法,但您可以自己完成一些工作。

你必须自己仲裁IO。您可以使用"\r"返回到没有ncurses或任何特定于平台的终端交互的行的开头。

总体流程为:

  • 您有一个输入循环,它读取按字符顺序输入到输入缓冲器中。默认行为是每性格一旦您收到换行符,您将提交该行从缓冲区中,使用换行符
  • 如果收到传入消息的通知,则应打印一个"\r"以将光标移回该行的开头,打印空格以清除该行,然后再打印另一个"\r\"以将指针恢复到开头,打印带有换行符的消息,然后打印当前缓冲输入

这里有很多边缘案例需要考虑,但ncurses并不是你唯一的选择。就我所测试的而言,这种技术在Windows和Linux上都有效。

如果不使用GUI或ncurses,就没有(实用的)解决方案。

几年前,我写过类似于ncurses的文章。它很小(两个简单的窗口),但与ncurses有关的代码不到100行,所以它几乎不是一个不可逾越的障碍。

ncurses的问题在于它一开始看起来(而且)有些古怪。这些文档并没有尽可能地提供帮助,也没有那么多人知道或关心它,所以当你把自己描绘成一个角落时,很难找到帮助。但如果你保持简单,你应该没事。

您可以自己将转义的控制序列发送到终端,但这与重新实现ncurses:)

是的,正如评论所说,您必须通过ncurses、ANSI代码或(可怕的)windows API与终端本身进行交互。没有办法使用标准流来实现这一点(作为,它们只进行输入/输出,不进行显示或光标感知)。

此外,流公开了一个同步(阻塞)API,因此如果不使用线程或反应器,就无法从一个API中读取和写入另一个API。