Начало работы с Qt Remote Objects
Введение
Модуль Qt Remote Objects предоставляет простой способ обмена API Qt между процессами и устройствами. Для этого требуется канал данных между процессами и устройствами. Для создания этого канала данных сначала нужен QRemoteObjectNode.
В QtRO узел является конечной точкой для связи. В сети удаленных объектов каждый участник, будь то процесс или устройство, нуждается в собственном узле. QtRO — это сеть «равноправных узлов», где подключенные узлы являются связями в сети.
Узлы сами по себе не очень полезны. Но их ценность проявляется, когда вы добавляете классы QObject в узел для обмена. Тогда любой узел-партнёр может запросить копию или экземпляр общего объекта из узла-хоста, узла, который его предоставляет.
В отличие от использования обычных экземпляров классов (с независимыми свойствами и сигналами), QtRO автоматически синхронизирует изменения в общем объекте по всем его копиям. За некоторыми исключениями, эти копии имеют идентичный API Qt, как исходный объект, и предназначены для использования точно так же, как если бы исходный объект был доступен.
В QtRO исходный объект называется источником. Это полностью реализованный класс C++, с необходимой бизнес-логикой для обеспечения требуемой функциональности. Копии этого объекта называются репликами. Вам не нужно писать код C++ для реплики; вместо этого вы запрашиваете экземпляр из узла. Хотя вам нужен код для использования реплики, например, для подключения сигналов к собственным слотам, вам не нужно реализовывать внутреннее поведение — это уже сделано за вас в источнике.
Поскольку источник может находиться в другом процессе или даже на другом устройстве, в QtRO есть факторы, которые необходимо учитывать, с которыми вы обычно не сталкиваетесь при разработке без межпроцессного взаимодействия (IPC). В частности, что произойдет, если процесс или устройство отсутствует? Именно здесь появляются дополнения к API реплики:
- Сигнал initialized() генерируется один раз, когда реплика получила состояние источника из сети QtRO.
- Как свойство isReplicaValid, так и сигнал stateChanged() сообщают вам, если соединение потеряно.
Объекты, обмениваемые через QtRO, используют связи (каналы) между узлами для всех коммуникаций. Если вы хотите обмениваться QObject, вы должны создать узел-хост с URL-адресом, к которому могут подключаться другие узлы. Вы также можете использовать реестр для упрощения подключений, но ваши узлы, которые обмениваются источниками, все равно должны быть узлами-хостами. Каждый общий объект получает имя (a QString), используемое для его идентификации в сети QtRO.
Реализация
Для иллюстрации использования удаленных объектов на стороне источника нам нужно:
- Создать объект Source, который дублируется на другие узлы, с использованием или без использования repc, компилятора Qt Remote Objects.
- Необязательно, создать реестр. В противном случае используйте прямые соединения.
- Создать узел-хост, чтобы объект источника можно было обмениваться.
- Вызвать функцию узла enableRemoting() для обмена объектом источника.
На стороне реплики нам нужно:
- Необязательно, использовать repc для генерации заголовка реплики для вашего проекта.
- Создать узел, который будет подключаться к узлу-хосту источника.
- Вызвать функцию узла acquire() для создания указателя на реплику.
Следующие примеры иллюстрируют как объекты, скомпилированные с помощью repc, статические объекты, так и динамические объекты источника. Кроме того, они демонстрируют прямые подключения, а также подключения, использующие реестр между узлами.
- Пример 1: Прямое подключение с использованием статического источника
- Пример 2: Прямое подключение с динамической репликой
- Пример 3: Подключения к удалённым узлам с использованием реестра
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtremoteobjects-gettingstarted.html