このページについて

Qt Remote Objects レプリカ

コンパイル済みレプリカは、QRemoteObjectReplica を基底とする型であり、派生クラスの定義はrepcコンパイラによって自動的に生成されます。CMake 関数やqmake変数を使用してrepcコンパイラを実行する場合、この生成処理はビルドプロセスの一部となります。生成されるのはヘッダーのみですが、これは完全な型です。 パブリックなコンストラクタは存在しないため、Replicaインスタンスを作成するにはQRemoteObjectNode::acquire テンプレート関数を使用する必要があります。

QRemoteObjectDynamicReplica は実行時に生成することも可能です。これを行うには、QRemoteObjectNode::acquireDynamic()を呼び出し、引数としてソース名(QString )を渡します。動的レプリカはC++から使用する際に多少記述が煩雑になりますが、コンパイルは不要です。動的レプリカは、初期化されるまではプロパティの初期値やイントロスペクションをサポートしません。

これら2つのレプリカ作成方法の重要な違いは、レプリカが初期化される前の挙動にあります。動的レプリカは初期化後に初めてメタオブジェクトを取得するため、初期化前は基本的にAPIが利用できません。つまり、プロパティもなければ、スロットを接続するためのシグナルもありません。

コンパイル済みレプリカのmetaObjectはコンパイル時に作成されるため、レプリカがインスタンス化された時点でそのAPIを利用できます。テンプレートファイル内でプロパティのデフォルト値を指定することも可能で、これらはレプリカがソースからの現在の値で初期化されるまで使用されます。

レプリカの初期化

ホストノードは、自身がホストするソースのリストを、それに接続する他のすべてのノードと共有します。このホストは、リストにソースが追加されたり削除されたりした際に、更新情報を送信します。 このようにして、接続されたノードは、自身がどのソースにアタッチできるかを常に把握できます。特定のソースに対する変更は、そのソースのレプリカを持つノードにのみ伝播されます。その結果、不要なネットワークトラフィックを回避できます。

ノードが既知のソースのレプリカを取得する際、そのソースに対するリクエストをホストノードに送信します。このリクエストを受信すると、ホストは、そのソースのすべてのプロパティの現在の値を含む応答パケットを作成します。要求されたレプリカがdynamic である場合、応答パケットにはそのソースのAPI定義が含まれます。 それ以降、そのレプリカを保持するノードは、そのソースへの変更を受け取る接続のリストに含まれるようになります。

レプリカがインスタンス化されたものの、そのノードが要求されたソースをホストするノードに接続されていない場合、あるいはそのオブジェクトがホストノードのプロセス内に存在しても、QObject に対して共有/リモート処理が有効化されていない場合、レプリカは作成されますが、初期化されないままとなります。

その後、レプリカのノードが、接続されたノードから要求されたソースが利用可能になったという通知を受けた場合、その時点でソースを要求し、初期化プロセスを開始します。

ホストノードへの接続が切断された場合、レプリカは「無効」状態に移行します。レプリカは再接続を試み、接続が復旧した場合は再初期化を行います。これにより、すべてのプロパティが最新の状態に保たれます。

レプリカの所有権

取得メソッドは、ノードによってインスタンス化されたレプリカ `QObject ` へのポインタを返します。ノードには、レプリカの意図された存続期間を知る手段がありません。したがって、レプリカが不要になった場合、それを削除するのは呼び出し元プログラムの責任となります。

同じレプリカを複数インスタンス化することができます。単一のノードから生成された同一ソースのすべてのレプリカは、ネットワーク通信を処理するプライベートデータメンバーを共有します。つまり、レプリカのインスタンスが複数あっても追加のネットワークトラフィックは発生しませんが、処理上のオーバーヘッドが多少生じます。 レプリカを削除し忘れると、このプライベートオブジェクトの参照カウントが 0 になるのを妨げ、呼び出し元プロセスが終了するまで不要なネットワーク通信が発生し続けます。このため、レプリカのライフタイムを追跡するために、QScopedPointer またはQSharedPointer を使用することをお勧めします。

© 2026 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.