Qt 远程对象副本

初始化

一个编译后的副本是一个基于 QRemoteObjectReplica 的类型,其中派生类定义由 repc 编译器自动生成。当您使用 CMake 函数qmake 变量 运行 repc 编译器时,这会使得构建过程中的生成部分。尽管只生成了头文件,但它是一个完整的类型。没有公开的构造函数,因此您需要使用 QRemoteObjectNode::acquire 模板函数来创建副本实例。

一个 QRemoteObjectDynamicReplica 可以在运行时生成。为此,您需要调用 QRemoteObjectNode::acquireDynamic(),并将源名称(一个 QString)作为参数传入。动态副本在 C++ 中的使用稍微繁琐一些,但它们不需要编译。动态副本在初始化之前不支持初始属性值或反射。

由于编译副本的 metaObjects 是在编译时创建的,它们的 API 在副本实例化时是可用的。您甚至可以在模板文件中为属性提供默认值,这些值将被用到副本使用当前源值进行初始化之前。

副本初始化

主节点会将它所托管源的列表与每个连接到它的节点共享。当向列表中添加或从列表中删除源时,主节点会发送更新。通过这种方式,已连接的节点始终知道它可以附加到的源。对特定源的改变只会传播给有该源副本的节点。因此,这种方式可以避免任何不必要的网络流量。

当一个节点为一个已知的源获取副本时,它会向主节点发送对该源的要求。在接收到此请求后,主节点创建一个包含该源所有属性当前值的回复包。如果请求的副本是 动态 的,则回复包包括该源的 API 定义。从那时起,副本的节点将包括在接收该源变化的连接列表中。

如果副本已实例化,但它的节点尚未连接到托管请求源的主节点,或者该对象位于主节点进程,但尚未为 QObject 启用共享/远程功能,则副本仍将被创建,但保持未初始化状态。

在之后的某个时间点,如果副本的节点被告知请求的源可以从连接的节点获得,那么在那一刻,它将请求该源并开始初始化过程。

如果与主机节点的连接丢失,副本将进入无效状态。它将尝试重新连接,如果连接恢复,将重新初始化;这确保所有属性都是最新的。

副本所有权

获取方法返回节点实例化的副本 QObject 的指针。节点无法知道副本的预期寿命。因此,当副本不再需要时,删除它是由调用程序负责的。

您可以实例化同一副本的多个副本。来自单个节点的同一来源的所有副本将共享一个用于处理网络通信的私有数据成员。这意味着多个副本实例不会引入额外的网络流量,尽管会有一些额外的处理开销。未删除副本将防止此私有对象的引用计数达到0,并导致在调用进程退出之前不必要的网络通信。因此,建议使用 QScopedPointerQSharedPointer 来帮助跟踪副本的寿命。

© 2024 Qt公司有限公司。此处包含的文档贡献各自的版权所有者。此处提供的文档是根据自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款进行许可的。Qt及其相关标志是芬兰及其在世界上其他国家的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。