Qt websocket 在进入下一个方法之前发送消息并等待响应
Qt websocket send message and wait for response before going to next method
我正在使用 Qt websockets。
想问你,你知道我怎么能这样沟通的吗:
例如我有这两种方法,我想发送消息到服务器,而不是等待响应(因为它会刷新data
变量)和 比过程 myMethod()
client->sendMessageToServer();
myMethod(data);
当然可以使用 Signal 和 Slots...但不知道如何在这里使用它,请参阅:
当我去时 sendMessageToServer()
好的,它将向服务器发送消息
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();
}
在另一个 class 中你可以做
connect(client, &Client::dataChanged,this,&<...>::myMethod);
然后打电话给
client->sendMessageToServer();
//without the myMethod call
每当 setData
被调用时 myMethod
也会自动被调用。
Qt 在大多数情况下并不意味着 "waiting"。它是事件驱动的。您定义一个事件(或使用一个已经存在的事件)并告诉程序在该事件发生时要做什么。
与 "normal" 编程相比有点不寻常,但你会习惯的。
事实上它是这样工作的:
它首先处理了 myMethod(),然后到达了 onMessageRecieved,但为时已晚。我所做的是删除 mymethod() 并将其放入插槽中。我让它在消息到来时发出。
我已经实现了一个与我正在解决的问题类似的示例。
在这个问题中,我必须从需要 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;
}
我正在使用 Qt websockets。
想问你,你知道我怎么能这样沟通的吗:
例如我有这两种方法,我想发送消息到服务器,而不是等待响应(因为它会刷新data
变量)和 比过程 myMethod()
client->sendMessageToServer();
myMethod(data);
当然可以使用 Signal 和 Slots...但不知道如何在这里使用它,请参阅:
当我去时 sendMessageToServer()
好的,它将向服务器发送消息
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();
}
在另一个 class 中你可以做
connect(client, &Client::dataChanged,this,&<...>::myMethod);
然后打电话给
client->sendMessageToServer();
//without the myMethod call
每当 setData
被调用时 myMethod
也会自动被调用。
Qt 在大多数情况下并不意味着 "waiting"。它是事件驱动的。您定义一个事件(或使用一个已经存在的事件)并告诉程序在该事件发生时要做什么。
与 "normal" 编程相比有点不寻常,但你会习惯的。
事实上它是这样工作的:
它首先处理了 myMethod(),然后到达了 onMessageRecieved,但为时已晚。我所做的是删除 mymethod() 并将其放入插槽中。我让它在消息到来时发出。
我已经实现了一个与我正在解决的问题类似的示例。 在这个问题中,我必须从需要 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;
}