我在C中写了一个可以在终端中使用的聊天......
为了接收短信,我有一个线程将在STDOUT上打印出该消息
另一个主题是从stdin读取...
问题是,如果在输入时将新消息打印到stdout,它将在我键入的内容之间打印。
我研究了几个小时的GNU readline实验,以防止出现这个问题。我想要重新发布" Redisplay"函数将帮助我这里..但我无法在Mac OSX上编译我的程序如果我使用某些重新显示函数(它说ld:未定义的符号)而其他函数正常工作...我在Ubuntu机器上编译了这个程序并在那里它工作......我真的不知道为什么......
尽管如此,如何才能实现写入stdout的所有内容都高于我目前正在撰写的文本?
答案 0 :(得分:0)
你基本上有两种解决方案。
第一种方法是使用能够帮助您将屏幕划分为不同部分的内容,而@Banthar说ncurses是标准解决方案。
第二种是同步你的着作和读物。从网络读取并写入控制台的线程可能只是推迟消息,直到您从键盘输入内容,此时您可以通过一次写入所有消息来简单地刷新消息缓冲区。警告:这个解决方案可能会导致缓冲区溢出,你可能会忘记太旧的消息或者在满了时刷新缓冲区。
答案 1 :(得分:0)
如果您要求它仅使用stdin和stdout(即哑终端),则必须首先将控制台输入配置为不是行缓冲的,这是默认的(在类似Unix的系统上为stty -icanon
)。遗憾的是,我找不到以编程方式执行此操作的便携方法,但您会在SO How to avoid press enter with any getchar()上的其他问题中找到更多内容。
然后,您必须逐个字符地整理下一个传出消息。因此,当输入消息准备好在输出信息的写入过程中传递时,您可以跳线,写输出消息,(最终跳转另一行或执行通常用于提示的操作)和重写是输入缓冲区,这样用户就可以准确输入他已经输入的字符。
您必须使用一种互斥,以避免输入线程在输出线程完成所有工作时对输入缓冲区进行任何访问。