Qt Remote Objects Replik

Ein kompiliertes Replikat ist ein auf QRemoteObjectReplica basierender Typ, bei dem die Definition der abgeleiteten Klasse automatisch durch den repc-Compiler generiert wird. Wenn Sie CMake-Funktionen oder qmake-Variablen zum Ausführen des repc-Compilers verwenden, ist die Generierung Teil des Build-Prozesses. Obwohl nur ein Header generiert wird, handelt es sich um einen vollständigen Typ. Es gibt keinen öffentlichen Konstruktor, daher müssen Sie die QRemoteObjectNode::acquire Template-Funktion verwenden, um die Replica-Instanz zu erzeugen.

Eine QRemoteObjectDynamicReplica kann zur Laufzeit generiert werden. Dazu rufen Sie QRemoteObjectNode::acquireDynamic() auf und geben den Quellnamen ( QString) als Argument an. Dynamische Replikate sind von C++ aus etwas umständlicher zu verwenden, aber sie erfordern keine Kompilierung. Dynamische Replikate unterstützen keine anfänglichen Eigenschaftswerte oder Introspektion, bis sie initialisiert wurden.

Ein wichtiger Unterschied zwischen diesen beiden Arten der Erstellung von Replikaten ist das Verhalten, bevor das Replikat initialisiert wird. Da ein dynamisches Replikat erst nach der Initialisierung ein MetaObjekt erhält, hat es vor der Initialisierung im Grunde keine API - keine Eigenschaften und keine Signale, mit denen Slots verbunden werden können.

Da Metaobjekte für kompilierte Replikate zur Kompilierzeit erstellt werden, ist ihre API verfügbar, wenn das Replikat instanziert wird. Sie können sogar Standardwerte für Eigenschaften in der Vorlagendatei angeben, die verwendet werden, bis die Replik mit aktuellen Werten aus der Quelle initialisiert wird.

Replik-Initialisierung

Ein Host-Knoten teilt die Liste der Quellen, die er hostet, mit jedem anderen Knoten, der eine Verbindung zu ihm herstellt. Dieser Host sendet Aktualisierungen, wenn Quellen zu der Liste hinzugefügt oder aus ihr entfernt werden. Auf diese Weise weiß ein verbundener Knoten immer, mit welchen Quellen er sich verbinden kann. Änderungen an einer bestimmten Quelle werden nur an Knoten weitergegeben, die eine Kopie dieser Quelle besitzen. Auf diese Weise wird unnötiger Netzwerkverkehr vermieden.

Wenn ein Knoten ein Replikat einer bekannten Quelle erwirbt, sendet er eine Anforderung für diese Quelle an den Host-Knoten. Nach Erhalt dieser Anfrage erstellt der Hostknoten ein Antwortpaket mit den aktuellen Werten für alle Eigenschaften dieser Quelle. Wenn die angeforderte Replik dynamic ist, enthält das Antwortpaket die API-Definition für die Quelle. Von da an wird der Knoten der Replik in die Liste der Verbindungen aufgenommen, die Änderungen an dieser Quelle erhalten.

Wenn ein Replikat instanziiert wird, aber sein Knoten nicht mit dem Knoten verbunden ist, der die angeforderte Quelle hostet - oder dieses Objekt in einem Host-Knotenprozess lebt, aber Sharing/Remoting für die QObject nicht aktiviert wurde - wird das Replikat dennoch erstellt, bleibt aber uninitialisiert.

Wenn der Knoten des Replikats zu einem späteren Zeitpunkt benachrichtigt wird, dass die angeforderte Quelle von einem verbundenen Knoten verfügbar ist, wird er die Quelle anfordern und den Initialisierungsprozess starten.

Wenn die Verbindung zu einem Host-Knoten unterbrochen wird, geht der Replikator in den ungültigen Zustand über. Sie versucht, die Verbindung wiederherzustellen und wird neu initialisiert, wenn die Verbindung wiederhergestellt ist; dadurch wird sichergestellt, dass alle Eigenschaften aktuell sind.

Replikat-Eigentümerschaft

Die Acquire-Methoden geben einen Zeiger auf das vom Knoten instanziierte Replikat QObject zurück. Der Knoten hat keine Möglichkeit, die beabsichtigte Lebensdauer der Replik zu kennen. Wenn das Replikat nicht mehr benötigt wird, liegt es daher in der Verantwortung des aufrufenden Programms, es zu löschen.

Sie können mehrere Kopien desselben Replikats instanziieren. Alle Replikate der gleichen Quelle von einem einzigen Knoten aus teilen sich ein privates Datenelement, das die Netzwerkkommunikation abwickelt. Das bedeutet, dass mehrere Instanzen eines Replikats keinen zusätzlichen Netzwerkverkehr verursachen, obwohl ein gewisser zusätzlicher Verarbeitungs-Overhead entsteht. Wenn die Replikate nicht gelöscht werden, wird verhindert, dass die Anzahl der Verweise auf dieses private Objekt 0 erreicht, was zu unnötiger Netzwerkkommunikation führt, bis der aufrufende Prozess beendet wird. Aus diesem Grund wird empfohlen, QScopedPointer oder QSharedPointer zu verwenden, um die Lebensdauer der Replikate zu verfolgen.

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