【问题标题】:How to fix window freezing issue (not responding) when it comes to receiving message from a client?从客户端接收消息时如何解决窗口冻结问题(无响应)?
【发布时间】:2013-09-08 10:23:31
【问题描述】:

我在我的 C++ 代码中使用 SFML。我的问题与这个问题(SFML TCP packet receive)类似,但由于答案不令我满意,我决定提出一个新问题。

在我的代码中,服务器和客户端需要交换确认消息才能继续程序的下一个阶段。但是,当服务器期望从客户端接收消息时,窗口冻结并显示“未响应”,我该如何解决这个问题?我已经让 setBlocking 变量为 false。

我的代码如下:

sf::Socket::Status status;
string msg;
if (isServer)
{
    do {
        status = host.receiveMessage(msg);
    } while (status != sf::Socket::Done || msg!= "done1");

    status = host.sendMessage("done1");

}
else
{
    do {
        status = host.sendMessage("done1");
    } while (status != sf::Socket::Done);

    do {
        status = host.receiveMessage(msg);
    } while (status != sf::Socket::Done || msg!= "done1");
}

【问题讨论】:

  • Sooo.. 你用 while 循环替换了阻塞调用?
  • 哦!我明白了,这是因为 while 循环。那我可以知道该怎么做吗?我必须等待客户的回复,但我不希望它冻结:(

标签: c++ sockets sfml


【解决方案1】:

您应该创建一个额外的线程来与客户端通信。 或者使用其他套接字模型,当传入数据可用时,窗口会收到一条消息。

【讨论】:

  • 您介意给我一些提示以在额外线程中编写函数吗?我已阅读文档并尝试在我的代码中实现,但似乎我仍然不够熟悉使用该类。
【解决方案2】:

我不能说我自己尝试过,但您可能会发现 SFML 游戏开发书的source code 很有用。

有一整章是关于使用 sfml 建立网络的(最后一章),您可能会在那里找到所有需要的答案。

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多