Начало работы с 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.
Реализация
Чтобы проиллюстрировать использование удаленных объектов, со стороны источника нам нужно:
- Создать объект Источник, который дублируется на других узлах, с использованием или без использования 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-5.15/qtremoteobjects-gettingstarted.html