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

时间:2011-05-27 16:55:09

标签: c++ concurrency input terminal

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

我将解释我希望我的程序如何表现一个例子: 在传入消息之前:

>user partial input

传入消息后:

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

相反,传入消息之后会自然发生这种情况:

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

之后,用户仍然可以使用退格键删除之前写的内容,但屏幕上没有显示,并且整体上存在UI混乱。

有没有办法在不使用ncurses的情况下实现所需的行为?

谢谢。

编辑:对不起,我忘了写我的环境是什么,这是Cygwin。感谢所有答案。

4 个答案:

答案 0 :(得分:4)

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

您必须自己仲裁IO。您可以使用“\ r”返回行的开头而不使用ncurses或任何特定于平台的终端交互。

整体流程将是:

  • 你有一个读取的输入循环 以字符方式输入缓冲区。 默认行为是回显每一个 字符。一旦收到了 换行,你会提交那一行 从您的缓冲区和打印 新队。
  • 如果您收到传入消息的通知,则应打印“\ r \ n”以将光标移回行的开头,打印空格以清除该行,然后再按“\ r \ n”将光标恢复到首先,使用换行符打印消息,然后打印当前缓冲的输入。

这里有很多边缘情况要考虑,但ncurses不是你唯一的选择。就我测试而言,这种技术适用于Windows和Linux。

答案 1 :(得分:1)

没有使用GUI或ncurses没有(实用)解决方案。

几年前我和ncurses写了类似的东西。这是最小的(两个简单的窗口),但不到100行代码与ncurses有关,所以它几乎不是一个不可逾越的障碍。

ncurses的问题在于它起初看起来有些古怪。文档并没有那么有用,也没有那么多人知道或关心它,所以当你把自己画成一个角落时,很难找到帮助。但是,如果你保持简单,你应该没事。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

此外,流会公开同步(阻塞)API,因此您无法在不使用线程或反应器的情况下从一个API读取并写入另一个API。