Qt Remote Objects 复制
编译副本是一种基于QRemoteObjectReplica 的类型,其中派生类的定义由repc编译器自动生成。当你使用CMake 函数或qmake 变量运行repc编译器时,这将使生成成为构建过程的一部分。虽然只生成了一个头文件,但它是一个完整的类型。Replica 没有公共构造函数,因此需要使用QRemoteObjectNode::acquire 模板函数来创建 Replica 实例。
QRemoteObjectDynamicReplica 可以在运行时生成。为此,您可以调用QRemoteObjectNode::acquireDynamic() 并将源代码名称(一个QString )作为参数传递给它。在 C++ 中使用动态副本比较繁琐,但不需要编译。动态副本不支持初始属性值,在初始化之前也不支持自省。
这两种创建副本方式的一个重要区别在于副本初始化前的行为。由于动态副本只有在初始化后才会获得元对象,因此它在初始化前基本上没有应用程序接口(API)--没有属性,也没有连接插槽的信号。
由于编译副本的元对象是在编译时创建的,因此当副本实例化时,它们的 API 就可用了。你甚至可以在模板文件中为属性提供默认值,这些默认值会一直使用,直到用源代码中的当前值对副本进行初始化。
副本初始化
主机节点将与连接到它的每个其他节点共享其托管的源列表。当源被添加到列表或从列表中删除时,该主机会发送更新。这样,已连接的节点就能随时知道自己可以连接哪些源。对特定信源的更改只会传播到拥有该信源副本的节点。这样就避免了不必要的网络流量。
当节点获得一个已知数据源的副本时,它会向主机节点发送一个关于该数据源的请求。收到请求后,主机会创建一个包含该来源所有属性当前值的回复数据包。如果请求的副本是dynamic ,回复数据包中就会包含源的 API 定义。从那时起,副本的节点将被列入接收该源更改的连接列表中。
如果副本已实例化,但其节点未连接到托管请求的源的节点,或该对象存在于主机节点进程中,但QObject 未启用共享/远程功能,则副本仍将被创建,但保持未初始化状态。
如果在稍后时间,副本的节点收到通知,称所请求的源可从已连接的节点获得,此时它将请求获得源并启动初始化进程。
如果与主机节点的连接丢失,副本将过渡到无效状态。它将尝试重新连接,并在连接恢复后重新初始化;这将确保所有属性都是当前的。
副本所有权
获取方法会返回一个指向节点实例化的副本QObject 的指针。节点无法知道副本的预期寿命。因此,当不再需要副本时,调用程序有责任将其删除。
您可以为同一个副本实例化多个副本。来自单个节点的同一来源的所有副本将共享一个处理网络通信的私有数据成员。这意味着副本的多个实例不会带来额外的网络流量,尽管会有一些额外的处理开销。如果不删除副本,就会阻止该私有对象的引用计数为 0,并导致不必要的网络通信,直到调用进程退出。因此,建议使用QScopedPointer 或QSharedPointer 来帮助跟踪副本的生命周期。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.