Spec-Zone.ru › Qt

Реплика удаленных объектов Qt

Скомпилированная реплика — это тип, основанный на QRemoteObjectReplica, где определение производного класса автоматически генерируется компилятором repc. При использовании функций CMake или переменных qmake для запуска компилятора repc, это делает генерацию частью процесса сборки. Несмотря на то, что генерируется только заголовочный файл, это полноценный тип. Нет публичного конструктора, поэтому для создания экземпляра реплики необходимо использовать шаблонную функцию QRemoteObjectNode::acquire.

Реплика QRemoteObjectDynamicReplica может быть сгенерирована во время выполнения. Для этого вызывается QRemoteObjectNode::acquireDynamic(), передавая имя источника (объект QString) в качестве аргумента. Динамические реплики немного сложнее использовать из C++, но не требуют компиляции. Динамические реплики не поддерживают начальные значения свойств или интроспекцию до момента их инициализации.

Важное различие между этими двумя способами создания реплик заключается в поведении до инициализации реплики. Поскольку динамическая реплика получает метаобъект только после инициализации, у неё фактически нет API до инициализации — нет свойств и нет сигналов для подключения слотов.

Так как метаобъекты для скомпилированных реплик создаются на этапе компиляции, их API доступен при создании экземпляра реплики. Вы даже можете указать значения по умолчанию для свойств в файле шаблона, которые используются до тех пор, пока реплика не будет инициализирована текущими значениями из источника.

Инициализация реплики

Узел-хост будет обмениваться списком источников, которые он предоставляет, с каждым другим подключённым узлом. Этот хост отправляет обновления при добавлении или удалении источников из списка. Таким образом, подключённый узел всегда будет знать, к каким источникам он может подключиться. Изменения конкретного источника распространяются только на узлы, у которых есть реплика этого источника. Соответственно, это позволяет избежать ненужного сетевого трафика.

Когда узел получает реплику для известного источника, он отправляет запрос об этом источнике узлу-хосту. Получив этот запрос, хост создаёт ответный пакет с текущими значениями всех свойств этого источника. Если запрошенная реплика — динамическая, ответный пакет включает определение API для источника. После этого узел реплики будет включён в список подключений, которые получают изменения этого источника.

Если реплика создана, но её узел не подключён к узлу, предоставляющему запрошенный источник — или если объект находится в процессе узла-хоста, но совместное использование/удалённый доступ не активирован для QObject — реплика всё равно будет создана, но останется неинициализированной.

Если впоследствии узел реплики получит уведомление о доступности запрошенного источника от подключённого узла, он запросит источник и запустит процесс инициализации.

Если соединение с узлом-хостом разорвано, реплика переходит в состояние недействительности. Она попытается повторно подключиться и повторно инициализироваться, если соединение будет восстановлено; это гарантирует, что все свойства будут актуальными.

Владение репликой

Методы acquire возвращают указатель на экземпляр QObject реплики, созданный узлом. Узел не может знать предполагаемый срок существования реплики. Следовательно, когда реплика больше не нужна, программа, её вызвавшая, обязана её удалить.

Вы можете создать несколько копий одной и той же реплики. Все реплики одного и того же источника от одного узла будут использовать общую закрытую переменную, которая обрабатывает сетевое взаимодействие. Это означает, что несколько экземпляров реплики не увеличивают сетевой трафик, хотя может быть дополнительная нагрузка на обработку. Неудаление реплик помешает счётчику ссылок на этот закрытый объект достигнуть 0 и вызовет ненужное сетевое взаимодействие до выхода вызвавшего процесса. По этой причине рекомендуется использовать QScopedPointer или QSharedPointer для отслеживания срока службы реплик.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtremoteobjects-replica.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API