2011-06-20 58 views
3

我有客户端可以在2个线程上工作。一个是发送数据,另一个是接收数据。在发送数据时,我有std::getline(std::cin,string)。现在在这个线程中,我有无限循环,如果第二个线程结束或者如果用户放入EXIT命令,那么所有工作都很好,当第二个线程结束并且无限循环结束时,由于std::getline,程序仍然等待按下按钮。
现在问题:getline和线程问题

如何发送数据到getline到“假”按钮,所以我不必按按钮结束程序?

第二个问题我有服务器为每个客户端运行另一个线程和服务器的主线程接受新的连接,它也工作得很好。客户存储在std::list。每个线程都有一个从客户端接收数据的循环。如果客户端诅咒他太多,他正从服务器踢,但这是当用户做这个问题,我只是从infite循环中断,线程正在结束,但我也想从列表中删除客户端,所以在程序的主线程中,我必须检查每次如果任何线程返回正确的值,并且它是否从列表中删除了元素?

+0

您正在使用哪种多线程系统?您可能会使用特定的库函数中断或终止其他线程。 –

+0

Windows,我知道我可以杀死线程,但我宁愿结束它,并安全擦除用户 – Darek

回答

3

一方正在发送数据,另一方正在接收数据。在发送数据我有std :: getline(std :: cin,string)。

这似乎不对。 cin需要输入;它不会发送东西。你有它阻止,实际上,这会导致问题。

当第二个线程结束,无限循环结束时,程序仍在等待压制,因为性病的按钮::函数getline

啊,我们走吧!

如何将数据发送到getline到“假”按钮,所以我不必按按钮结束程序?

你不行。更好的方法是尝试找到一种方法来“取消”流提取请求(getline调用),但是你也不能这样做。

而是阻止getline电话,使用一个无限循环,sleep和定期peek S插入cin缓冲区,看是否可以从中读到的数据。然后用get读取可用字节。

当用户这样做,我刚刚从infite回路断线和线即将结束,但我也想从列表中删除客户端,以便在程序的主线程中我必须检查每次如果任何线程的返回正确的值,如果它从列表中删除元素?

或者客户端线程调用一些标记客户端为“要删除”的成员函数。在主线程下一次循环迭代开始时,从std::list中删除标记为“要删除”的任何客户端。

你可以用第二个容器做这个标记,在两个线程之间仔细共享。

+0

我明白了。我知道cin不会发送数据。我首先从输入中获取数据,然后使用send()函数发送数据。是的getline阻塞,这就是为什么我问我怎么能发送一些假的“数据”流,所以程序会认为我按下按钮。我会尝试使用线程,似乎是个好主意。你可以在获得这些信息时更多地了解一些情况吗? – Darek

+0

@Darek:如果你有一个专门用于分派(发送)数据的线程,它不应该接受输入,它肯定不应该阻止这样做。向流发送“假”数据不是正确的解决方案;阻止它首先被阻塞(或完全消除它的使用)。 –

+0

那么我怎样才能从用户那里接受输入?谢谢你的时间。 – Darek