我的客户端适用于2个线程。一个是发送数据,另一个是接收数据。在发送数据时,我有std::getline(std::cin,string)
。现在在这个线程中我有无限循环,如果第二个线程结束或者如果用户放置EXIT命令就结束,一切都很好,期望当第二个线程结束并且无限循环结束时,程序仍然等待按下按钮因为std::getline
。
现在提问:
如何将数据发送到getline到“假”按钮,这样我就不必按按钮来结束程序了?
第二个问题我有服务器,每个客户端运行另一个线程,服务器的主线程接受新连接,它也很好用。客户端存储在std::list
中。每个线程都有inifnite循环,从客户端接收数据。如果客户端诅咒得太多,他就会受到服务器的攻击,但是当用户这样做时,问题就是我从infite循环中断并且线程正在结束但是我也想从列表中擦除客户端所以在程序的主线程中我必须检查每次如果任何一个线程返回正确的值,并且它是否从列表中删除了元素?
答案 0 :(得分:3)
一个是发送数据,另一个是接收数据。在发送数据时,我有std :: getline(std :: cin,string)。
这似乎不对。 cin
接受输入;它不发送东西。事实上,你有阻止,这会导致问题。
当第二个线程结束并且无限循环结束时,由于std :: getline
,程序仍然等待按下按钮
啊,我们走了!
如何将数据发送到getline到“假”按钮,这样我就不必按按钮来结束程序了?
你做不到。一种更好的方法是尝试找到一种方法来“取消”流提取请求(getline
调用),但你也不能这样做。
不是阻止getline
调用,而是在sleep
缓冲区中使用无限循环peek
和周期cin
来查看是否有要读取的数据。然后使用get
读取可用字节。
当用户这样做时我只是从infite循环中断并且线程正在结束但是我也想从列表中擦除客户端所以在程序的主线程中我必须每次检查是否有任何线程返回正确的值,如果它确实擦除列表中的元素?
或者客户端线程调用一些将客户端标记为“要删除”的成员函数。在主线程中的下一个循环迭代开始时,从std::list
删除标记为“要删除”的任何客户端。
您可以使用第二个容器进行此标记,在两个线程之间小心共享。