Qt Remote Objects Replik
Eine kompilierte Replik ist ein auf „ QRemoteObjectReplica “ basierender Typ, bei dem die Definition der abgeleiteten Klasse automatisch vom repc-Compiler generiert wird. Wenn Sie CMake-Funktionen oder qmake-Variablen zum Ausführen des repc-Compilers verwenden, wird die Generierung Teil des Build-Prozesses. Obwohl nur ein Header generiert wird, handelt es sich um einen vollständigen Typ. Da es keinen öffentlichen Konstruktor gibt, müssen Sie die Template-Funktion ` QRemoteObjectNode::acquire ` verwenden, um eine `Replica`-Instanz zu erstellen.
Ein „ QRemoteObjectDynamicReplica “ kann zur Laufzeit generiert werden. Dazu rufen Sie ` QRemoteObjectNode::acquireDynamic()` auf und übergeben den Quellnamen (ein ` QString`) als Argument. Die Verwendung dynamischer Repliken ist in C++ etwas umständlicher, erfordert jedoch keine Kompilierung. Dynamische Repliken unterstützen weder anfängliche Eigenschaftswerte noch Introspektion, bis sie initialisiert wurden.
Ein wichtiger Unterschied zwischen diesen beiden Methoden zur Erstellung von Replikaten ist das Verhalten vor der Initialisierung des Replikats. Da ein dynamisches Replikat erst nach der Initialisierung ein `metaObject` erhält, verfügt es vor der Initialisierung im Grunde über keine API – keine Eigenschaften und keine Signale, an die Slots angeschlossen werden könnten.
Da metaObjects für kompilierte Repliken zur Kompilierungszeit erstellt werden, steht ihre API bereits bei der Instanziierung der Replik zur Verfügung. Sie können in der Vorlagendatei sogar Standardwerte für Eigenschaften angeben, die so lange verwendet werden, bis die Replik mit den aktuellen Werten aus der Quelle initialisiert wird.
Initialisierung der Replik
Ein Host-Knoten teilt die Liste der von ihm gehosteten Quellen mit jedem anderen Knoten, der eine Verbindung zu ihm herstellt. Dieser Host sendet Aktualisierungen, wenn Quellen zur Liste hinzugefügt oder aus ihr entfernt werden. Auf diese Weise weiß ein verbundener Knoten stets, an welche Quellen er sich anschließen kann. Änderungen an einer bestimmten Quelle werden nur an Knoten weitergegeben, die über eine Replik dieser Quelle verfügen. Dadurch wird unnötiger Netzwerkverkehr vermieden.
Wenn ein Knoten eine Replik für eine bekannte Quelle abruft, sendet er eine Anfrage für diese Quelle an den Host-Knoten. Nach Erhalt dieser Anfrage erstellt der Host ein Antwortpaket mit den aktuellen Werten für alle Eigenschaften dieser Quelle. Handelt es sich bei der angeforderten Replik um „ dynamic “, enthält das Antwortpaket die API-Definition für die Quelle. Von diesem Zeitpunkt an wird der Knoten der Replik in die Liste der Verbindungen aufgenommen, die Änderungen an dieser Quelle empfangen.
Wird eine Replik instanziiert, ihr Knoten jedoch nicht mit dem Knoten verbunden ist, der die angeforderte Quelle hostet – oder sich das Objekt in einem Hostknotenprozess befindet, die gemeinsame Nutzung/Fernzugriff für die QObject jedoch nicht aktiviert wurde –, wird die Replik zwar erstellt, bleibt jedoch uninitialisiert.
Wird der Knoten der Replik zu einem späteren Zeitpunkt darüber informiert, dass die angeforderte Quelle von einem verbundenen Knoten aus verfügbar ist, fordert er die Quelle an und startet den Initialisierungsprozess.
Wenn die Verbindung zu einem Hostknoten unterbrochen wird, wechselt die Replik in den ungültigen Zustand. Sie versucht, die Verbindung wiederherzustellen, und initialisiert sich erneut, sobald die Verbindung wieder besteht; dadurch wird sichergestellt, dass alle Eigenschaften auf dem aktuellen Stand sind.
Eigentumsverhältnisse bei Replikaten
Die „acquire“-Methoden geben einen Zeiger auf den vom Knoten instanziierten Replika- QObject zurück. Der Knoten hat keine Möglichkeit, die beabsichtigte Lebensdauer des Replikats zu ermitteln. 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 derselben Replik instanziieren. Alle Repliken derselben Quelle von einem einzelnen Knoten teilen sich ein privates Datenelement, das die Netzwerkkommunikation abwickelt. Das bedeutet, dass mehrere Instanzen einer Replik keinen zusätzlichen Netzwerkverkehr verursachen, obwohl ein gewisser zusätzlicher Verarbeitungsaufwand entsteht. Werden Repliken nicht gelöscht, verhindert dies, dass der Referenzzähler dieses privaten Objekts den Wert 0 erreicht, und führt zu unnötiger Netzwerkkommunikation, bis der aufrufende Prozess beendet wird. Aus diesem Grund wird empfohlen, „ QScopedPointer “ oder „ QSharedPointer “ zu verwenden, um die Lebensdauer von Repliken nachzuverfolgen.
© 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.