我正在为我的网络课程编写聊天程序,我完全掌握了所有的网络设置。
我的问题是,如果客户端当前正在编写消息并且他从不同的客户端收到消息,那么他的当前输入将显示为收到的消息。
例如,如果客户正在撰写消息“你好,你好吗?”并收到一条消息“祝你好运!”在写消息的过程中,它显示为:
你好,祝你好运!
- >你好吗?
其中 - >是用户键入消息的区域。我想要发生的是只显示收到的消息并具有区域 - >保留收到邮件之前写的所有先前文本。
请注意,当客户收到消息时,客户输入的内容实际上仍然“存在”。如果他完成了他的消息,他的完整消息将被发送。
另请注意,我的客户端使用pthreads。一个线程从服务器读取消息并将其显示到用户屏幕,一个线程从stdin读取并将消息发送到服务器。我相信我的问题是因为我使用pthreads并且线程共享相同的stdin,stdout,stderr。也许这是一种误解和错误?
我希望我能清楚我的问题。如果没有,抱歉。请让我知道我能为您澄清的内容。
我开始做一些研究并发现了这些链接:
我正在考虑尝试上线并移动游标和东西,但不知道这是否是最有效的方法。首先是因为我不知道如何捕获终端中等待“进入”/发送到stdin的信息。也许我只是没有发现如何做到这一点。
此外,我想知道是否有办法处理/操作文件描述符来解决问题?也许这甚至不能解决它?
感谢阅读和你的时间。我感谢你的帮助。
答案 0 :(得分:4)
使用诸如curses之类的库来管理文本“窗口”比尝试手动操作屏幕更容易。
答案 1 :(得分:1)
我不是unix网络编程方面的专家,但我非常相信问题在于多线程本身而不是某些stdin / stdout怪癖。
我在这里看到的是多个线程在没有任何同步的情况下访问相同的资源(终端会话)。这不可避免地导致他们之间的竞争条件。
我建议你阅读这本关于同步问题的免费电子书,这对那些只是稍微熟悉同步的人来说特别有用:
答案 2 :(得分:0)
将线程指定为IO线程,并通过阻塞队列(或循环缓冲区)将要显示的消息发送到该线程。 C有那些吗? (我目前使用Java。)
答案 3 :(得分:0)
问题涉及线程化。您的解决方案是使用一个显示器并阻止传入消息,直到用户完成当前输入或使用两个“窗口”。许多会话程序有两个窗口:一个用于传入数据(或当前对话),另一个用于构建下一个消息。
标准C语言没有用于线程,窗口或光标定位的工具。您只需使用平台特定功能。由于您没有指定平台,因此您必须自己查看这些平台。
答案 4 :(得分:0)
默认情况下,用户输入由终端本身处理,因此如果您想要实时更新,单独使用互斥锁不会削减它。如果您想要一个行输入模式解决方案,您可以记录传入的消息,并在每次发送消息时以及在读取下一个消息之前提交它们。
否则,你最好的选择就是按照建议使用诅咒。启用了scrollok(3x)的窗口可以像使用waddstr(3x)和wgetnstr(3x)的终端一样使用,如果你使用类似IRC的UI,则无需进行微观管理。
请注意,使用curses并不意味着您不必在curses函数周围使用互斥锁。否则,当你不那么期待它时,屏幕就会充满垃圾。