【问题标题】:Qt websocket send message and wait for response before going to next methodQt websocket 在转到下一个方法之前发送消息并等待响应
【发布时间】:2016-10-28 10:41:34
【问题描述】:

我正在使用 Qt websockets。

想问你,你知道我该如何进行这种交流:

例如我有这两种方法,我想向服务器发送消息,而不是等待响应(因为它会刷新data 变量)和比进程myMethod()

client->sendMessageToServer();
myMethod(data);

当然我可以使用 Signal 和 Slots...但不知道如何在这里使用它,请参阅:

当我去sendMessageToServer() ok 时它会向服务器发送消息

void Client::sendMessageToServer(QString &str){

     m_wSocket.sendTextMessage(str);  
}

我应该发出什么?我不知道如何处于等待状态...QWebSocket 中没有这样的插槽,它只是立即转到方法myMethod。 它不在设置数据的地方: 顺便说一句,我在收到消息时设置了这样的客户端,因为它会转到onTextMessageRecieved

connect(&m_wSocket, &QWebSocket::textMessageReceived, this, &Client::onTextMessageReceived);

void Client::onTextMessageReceived(QString message)
{
    setData(message);       
}

你有什么想法吗?

【问题讨论】:

  • 你的意思是像textMessageReceived这样的信号?将您要调用的方法连接到那些。并为此在处理程序中调用您的myMethod
  • 您也可以在setData 中发出自定义信号并将此信号与myMethod 连接
  • 问题是,它没有达到 onMessageRecieved 所以 neiter setData... 它连接正确,只是在使用带有 2 个方法 sendMessageToserver 和 mymethod 的代码时,myMethod 没有实现其数据。
  • onMessageRecieved 不会被调用时,您不会收到任何数据,并且某处有其他问题。
  • 另见this question

标签: c++ qt networking


【解决方案1】:

您可以在setDataonTextMessageReceived 上发出信号并连接到此。

void Client::setData(QString message)
{
    //... whatever you do in setData

    emit dataChanged();       
}

然后你可以在其他类中做

connect(client, &Client::dataChanged,this,&<...>::myMethod);

然后打电话

client->sendMessageToServer();
//without the myMethod call

每当setData 被调用时,myMethod 也会自动被调用。

Qt 在大多数情况下并不意味着“等待”。它是事件驱动的。您定义一个事件(或使用一个已经存在的事件)并告诉程序在该事件发生时要做什么。

与“普通”编程相比,这有点不寻常,但你已经习惯了。

【讨论】:

    【解决方案2】:

    事实上它是这样工作的:

    首先它处理 myMethod(),然后到达 onMessageRecieved,这为时已晚。我所做的是我删除了 mymethod() 并将其放入一个插槽中。我让它在消息到来时发出。

    【讨论】:

      【解决方案3】:

      我已经为我正在解决的问题实现了一个类似的示例。 在这个问题中,我必须从需要 websocket 连接的相机获取图像。然后,为了使代码更简单,我将 lambda 函数用于回调和我在某处学到的一个特殊技巧,即创建事件循环并在信号退出之前等待信号发生。当您不想处理异步调用时,它非常有用。

      代码如下:

      QJsonObject Schedule::getImageWithInfo()
      {
          QString response;
          QString* responsePtr = &response;
      
          QWebSocket websocket;
          QWebSocket* websocketPtr = &websocket;
      
          QObject::connect(websocketPtr, &QWebSocket::connected, [&, websocketPtr, responsePtr]()
          {
              qInfo() << "Schedule::getImageWithInfo: Connected";
              QObject::connect(websocketPtr, &QWebSocket::textMessageReceived, [websocketPtr, responsePtr](const QString& msg)
              {
                  qInfo() << "Schedule::getImageWithInfo: message received";
                  *responsePtr = msg;
                  websocketPtr->close();
              });
      
              QJsonObject command;
              command.insert("command", "GET_IMAGES_WITH_INFO");
              QJsonDocument doc(command);
              QString strJson(doc.toJson(QJsonDocument::Compact));
              qInfo() << "Schedule::getImageWithInfo: Sending command " << strJson;
      
              websocketPtr->sendTextMessage(strJson);
          });
      
          websocket.open(QUrl(urlStr));
      
          QEventLoop eventLoop;
          QObject::connect(&websocket, SIGNAL(disconnected()), &eventLoop, SLOT(quit()));
          eventLoop.exec();
      
          QJsonObject responseObj = Utils::QJsonObjectFromString(response);
          return responseObj;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-25
        • 2023-03-07
        • 1970-01-01
        • 2020-08-06
        • 1970-01-01
        • 2021-10-13
        • 2015-07-15
        • 1970-01-01
        • 2016-10-11
        相关资源
        最近更新 更多