Qtリモートオブジェクトのレプリカ
コンパイルされたレプリカはQRemoteObjectReplica 、派生クラスの定義はrepcコンパイラによって自動的に生成されます。CMake関数や qmake変数を使用してrepcコンパイラを実行すると、ビルドプロセスの一部として生成されます。生成されるのはヘッダーだけですが、これは完全な型です。パブリック・コンストラクタはないので、QRemoteObjectNode::acquire テンプレート関数を使用して Replica インスタンスを生成する必要があります。
QRemoteObjectDynamicReplica 、実行時に生成することもできます。そのためには、QRemoteObjectNode::acquireDynamic ()を呼び出し、引数としてソース名(QString )を渡します。ダイナミック・レプリカは、C++から使用するには少し冗長ですが、コンパイルは必要ありません。ダイナミック・レプリカはプロパティの初期値や、初期化されるまでのイントロスペクションをサポートしていません。
これら2つのレプリカ作成方法の重要な違いは、レプリカが初期化される前の動作です。ダイナミックレプリカは初期化後にメタオブジェクトを取得するだけなので、初期化前には基本的に何のAPIも持っていません。
コンパイルされたレプリカのmetaObjectはコンパイル時に作成されるため、そのAPIはレプリカがインスタンス化された時点で利用可能です。テンプレートファイルでプロパティのデフォルト値を指定することもでき、その値はレプリカがソースから現在の値で初期化されるまで使用されます。
レプリカの初期化
ホスト・ノードは、ホストするソースのリストを、それに接続する他のすべてのノードと共有します。このホストは、ソースがリストに追加またはリストから削除されると、更新を送信します。このようにして、接続ノードは常に、どのソースに接続できるかを知ることができます。特定のソースに対する変更は、そのソースのレプリカを持つノードにのみ伝搬されます。その結果、不要なネットワーク・トラフィックが回避されます。
ノードが既知のソースのレプリカを取得すると、そのソースの要求をホスト・ノードに送信します。この要求を受信すると、ホストはそのソー スのすべてのプロパティの現在値を含む応答パケットを作成します。要求されたレプリカがdynamic の場合、リプライ・パケットにはソースの API 定義が含まれます。それ以降、レプリカのノードは、そのソースへの変更を受信する接続のリストに含まれます。
レプリカがインスタンス化されても、そのノードが要求されたソースをホストするノードに接続されていない場合、またはそのオブジェ クトがホスト・ノード・プロセス内に存在するが、QObject に対して共有/リモートが有効になっていない場合、レプリカは作成され ますが、初期化されていないままになります。
後日、レプリカのノードが、要求されたソースが接続ノードから利用可能であることを通知された場合、その時点でソースを要求し、初期化プロセスを開始します。
ホスト・ノードとの接続が失われた場合、レプリカは無効状態に遷移する。レプリカは再接続を試み、接続が回復すると再初期化を行います。
レプリカの所有権
acquireメソッドは、ノードによってインスタンス化されたレプリカQObject へのポインタを返します。ノードはレプリカの有効期間を知る術がありません。その結果、レプリカが不要になった場合、それを削除するのは呼び出し元のプログラムの責任となります。
同じレプリカの複数のコピーをインスタンス化することができます。1つのノードからの同じソースのすべてのレプリカは、ネットワーク通信を処理するプライベート・データ・メンバを共有します。つまり、レプリカを複数インスタンス化しても、若干の処理オーバーヘッドは発生するものの、追加のネットワーク・トラフィックは発生しません。レプリカの削除に失敗すると、このプライベート・オブジェクトの参照カウントが0にならず、呼び出し元のプロセスが終了するまで不要なネットワーク通信が発生します。このため、QScopedPointer またはQSharedPointer を使用して、レプリカの寿命を追跡することをお勧めします。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。