Qt websocket发送消息并等待响应,然后再进入下一个方法
Qt websocket send message and wait for response before going to next method
我正在使用Qt websockets。
我想问你,你知道我该怎么做这个沟通吗?
例如,我有这两个方法,我想发送消息到服务器,然后等待响应(因为它刷新了data
变量)和处理myMethod()
client->sendMessageToServer();
myMethod(data);
当然我可以使用信号和插槽…但是不知道在这里怎么用,请看:
当我点击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);
}
你知道吗?
您可以在setData
或onTextMessageReceived
上发出信号并连接到此
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并不意味着大多数时候都是"等待"的。它是事件驱动的。您定义一个事件(或使用一个已经存在的事件),并告诉程序在该事件发生时该做什么。
与"正常"编程相比,这有点不寻常,但你会习惯的。
我已经实现了一个例子,就像我正在解决的问题一样。在这个问题中,我必须从需要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;
}
事实是这样的:
它首先处理myMethod(),然后到达onmessagerreceived,这太迟了。我所做的就是删除mymethod()并将其放入槽中。我让它发出每当消息来
- 等待整个 omp 块完成,然后再调用第二个函数
- 我们是否需要调用SQLallochandle来分配SQLHSTMT,然后再调用SQLEXECTIRECT
- 将稀疏数组从 matlab 传递到 Eigen (C++),然后再传递回 matlab
- 如何将对象定义为一种类型,然后再将其声明为子类型
- 将表示位置的整数分解为多个部分,然后再返回
- Winsock 2,将变量凝结成一个字符串,将其发送出去,然后再进行回收并将其读回
- libsimdpp较慢,然后再调试GCC
- 将转换范围缩小到更大的类型(然后再回来)
- 将具有任意参数和占位符的函数存储在类中,然后再调用它
- 提升asio async_read_until,然后再提升async_read
- 我无法使用位置选项仿真子命令,然后再进行Unregistered_options
- 将人类可读日期转换为毫秒,然后再转换回来,而不会丢失信息
- 将成员函数指针强制转换为另一个类中的一个然后再返回是否安全
- 将 [char] 变量转换为 [int],然后再转换回 [char]
- C++如何通过引用将对象的向量传递到一个函数中,然后再传递到下一个函数中
- Kinect 从框架数据转换为深度数据,然后再转换回来
- 将 ASCII 字符串转换为 UTF-16,然后再将它们传递给 Windows API 函数
- 我正在尝试从一个目录中读取多个文件,并在我的程序中使用它们,然后再转到该目录中的其他文件
- 将派生的对象投射到基础,然后再投射回来
- Qt websocket发送消息并等待响应,然后再进入下一个方法