Qt リモートオブジェクトを始める

はじめに

Qt Remote Objects モジュールは、プロセスやデバイス間で Qt API を共有する簡単な方法を提供します。そのためには、プロセスとデバイスの間にデータチャネルが必要です。このデータチャネルを確立するには、まずQRemoteObjectNode が必要です。

QtROでは、ノードは通信のエンドポイントです。リモート・オブジェクト・ネットワークでは、プロセスであれデバイスであれ、各参加者が独自のノードを必要とする。QtROはピアツーピアのネットワークであり、接続されたノードがネットワークのリンクとなる。

ノードは、それだけではあまり役に立ちません。しかし、QObject クラスをノードに追加して共有することで、その価値が生まれます。そして、どのピアノードもホストノード(共有するノード)から共有オブジェクトのコピーやインスタンスを要求することができます。

通常のクラスインスタンス(独立したプロパティとシグナル発信を持つ)を使用する場合とは異なり、QtROは共有オブジェクトへの変更を、そのコピーすべてに自動的に同期させます。いくつかの例外を除き、これらのコピーは元のオブジェクトと同じ Qt API を持ち、元のオブジェクトが利用可能であるかのように使用することができます。

QtROでは、オリジナルのオブジェクトをソースと呼びます。これは完全に実装された C++ クラスで、必要な機能を提供するために必要なビジネスロジックを備えています。このオブジェクトのコピーをレプリカと呼びます。代わりにノードからインスタンスをリクエストします。レプリカを使用するためには、シグナルを自分のスロットに接続するなどのコードが必要ですが、内部動作を実装する必要はありません。

ソースは別のプロセス、あるいは別のデバイス上にある可能性があるため、QtROでは、プロセス間通信(IPC)なしで開発する場合には通常遭遇しないような、考慮しなければならない要素があります。具体的には、プロセスやデバイスが存在しない場合はどうなるのでしょうか?そこで、Replica APIに追加された機能です:

  • initialized() シグナルは、レプリカが QtRO ネットワークからソースの状態を受信すると発行されます。
  • isReplicaValid プロパティとstateChanged() シグナルは、接続が切れた場合に警告を発します。

QtRO上で共有されるオブジェクトは、すべての通信にノード間のリンク(コンジット)を使用します。QObject を共有したい場合は、他のノードが接続できる URL を持つホストノードを作成する必要があります。レジストリを使用して接続を容易にすることもできますが、ソースを共有するノードはホストノードである必要があります。各共有オブジェクトには名前(QString )が与えられ、QtROネットワーク上で識別するために使用されます。

実装

リモートオブジェクトの使い方を説明するために、ソース側では以下のことが必要です:

  1. Qtリモートオブジェクトコンパイラであるrepcを使用するしないに関わらず、他のノードに複製されるソースオブジェクトを作成します。
  2. オプションで、レジストリを作成します。そうでない場合は、直接接続を使用します。
  3. ソースオブジェクトを共有できるようにホストノードを作成します。
  4. ノードのenableRemoting() 関数を呼び出して、ソース・オブジェクトを共有します。

レプリカ側では、以下を行う必要がある:

  1. オプションで、repc を使用してプロジェクトのReplicaヘッダーを生成します。
  2. ソース・ホスト・ノードと接続するノードを作成します。
  3. ノードのacquire() 関数を呼び出して、レプリカへのポインタを作成します。

以下の例では、repc でコンパイルされた静的オブジェクトと動的なソース・オブジェクトの両方を示します。さらに、直接接続と、ノード間でレジストリを使用する接続も示します。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。