Spec-Zone.ru › Qt 5.15

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

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

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

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

Так как metaObjects для скомпилированных копий создаются во время компиляции, их 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-5.14/qtremoteobjects-replica.html

Spec-Zone.ru

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