qt - 在 Qt 远程对象上进行点对点通信
问题描述
我想在Qt Remote Objects上做一个简单的通信示例。我想让通信点对点,因此我试图在一个应用程序中合并同一远程对象功能的源和副本(REPC_MERGED
用于生成源和副本基类的工具)。
#include <QtCore/QCoreApplication>
#include "MyPeerHost.h"
#include "Client.h"
#include <QDebug>
static QString peer_node_name(int number)
{
QString ret = QString("peer_%1").arg(number);
return ret;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyPeerHost peerHost; // just inherits auto-generated MyPeerSimpleSource
QUrl thisAddress = "local:" + peer_node_name(0);
QRemoteObjectHost sourceNode(thisAddress);
if(sourceNode.enableRemoting(&peerHost))
{
qInfo() << "Source remoting enabled successfully" << thisAddress;
QUrl remoteAddress = "local:" + peer_node_name(1);
QSharedPointer<MyPeerReplica> replica;
QRemoteObjectNode replicaNode;
if(replicaNode.connectToNode(remoteAddress))
{
qInfo() << "Replica connected to the address" << remoteAddress << "successfully";
replica.reset(replicaNode.acquire<MyPeerReplica>());
QString sourceClassName = peerHost.staticMetaObject.className();
qDebug() << "Replica wait for Source" << sourceClassName << "...";
if(replica->waitForSource(1000))
{
qInfo() << "Replica object completely initialized";
Client client;
client.setReplicaObject(replica);
client.sendMessage("AAA");
}
else
{
qCritical() << "Replica wait for Source" << sourceClassName << "FAILED" << replicaNode.lastError();
}
}
else
{
qCritical() << "Replica connect to the address" << remoteAddress << "FAILED" << replicaNode.lastError();
}
}
else
{
qCritical() << "Source remoting enable FAILED" << sourceNode.lastError();
}
return a.exec();
}
应用输出:
Source remoting enabled successfully QUrl("local:peer_0") Replica connected to the address QUrl("local:peer_1") successfully Replica wait for Source "MyPeerHost" ... Replica wait for Source "MyPeerHost" FAILED QRemoteObjectNode::NoError
如您所见,replicaNode
成功连接到不存在的节点QUrl("local:peer_1")
。
我做错了什么?
解决方案
您没有有效的 Qt 代码。
Qt 依赖于事件循环来处理异步行为,该行为由a.exec()
main() 例程的末尾开始。反过来,Qt 远程对象依赖于事件循环进行所有通信。
在您的代码中,您在堆栈上创建对象,但在开始事件循环之前超出范围的代码块中。因此,它们将在事件循环开始之前被破坏。
我建议从一些示例开始,确保它们有效,然后从那里扩展您想要做的事情。
推荐阅读
- javascript - 延迟(异步)Blogger comment_from_post_iframe.js
- powerbi - Clockify API 和 Powerbi
- java - 如何在 Android Java 方法中形成更好的布尔值
- scala - Spark - scala - 如何将 DataFrame 转换为自定义对象?
- oracle - Oracle 查询结果为 JSON
- bash - 如果下一行符合特殊条件,如何输出当前行和下一行
- react-native - 如何在本机反应中自动显示当前位置
- javascript - 获取要加载到 amcharts 数据加载器中的天气预报数据
- dataframe - 如何在 Julia 中将缺失值插入我的数据框中
- python - For循环在一个输出后停止