LINUX.ORG.RU

Совместить программу на Qt и ZeroC ICE 3.6

 ,


0

1

Сабж. Есть обычная программа на Qt 5например9, а есть отдельный самодельный пример работы сервера на C++ (и тестовый клиент на Python набросал) - плюснутый сервер и питонский клиент работают замечательно.

Теперь же стоит задача грамотно объединить сервер в приложение на Qt. Сам ZeroC ICE предоставляет какие-то свои базовые классы типа Ice::Application, есть же механизмы колбэков, а также AMI (Asynchronous Method Invocation) - тоже на колобяках. Мне кажется всё это будет не очень красиво смешиваться с Qt.

Есть ли у кого-то опыт успешного объединения Qt + ZeroC ICE? Нужно чтобы ICE крутился в своем потоке и периодически отвечал на запросы клиента, и одновременно чтобы можно было подсунуть новые данные из остальной части программы на Qt. Как такое лучше сделать?

P.S. Пока думаю на своим вариантом, выложу когда сделаю.

Я как-то давно пробовал, в бытность ещё Ice 3.3. ЕМНИП, Ice на std, нужно просто конвертировать std в Qt классы и подсунуть виджетам. Ice::Applicatoin не помню что делает, но кажется его необязательно использовать, если у тебя уже есть Qt Event Loop

Просмотрел тут https://doc.zeroc.com/pages/viewpage.action?pageId=16715986 , твой Ice::Application даже не упоминается. Инициализировал адептеры и используй свой интерфейс на здоровье.

UVV ★★★★★ ()
Последнее исправление: UVV (всего исправлений: 1)

Есть ли у кого-то опыт успешного объединения Qt + ZeroC ICE?

Есть.

есть же механизмы колбэков,

О чём речь? Вызовы методов выполняются на потоках их пула Ice.

а также AMI (Asynchronous Method Invocation) - тоже на колобяках

QEvent тут помогает.

Нужно чтобы ICE крутился в своем потоке

У него вообще-то пул потоков. Ice::Application использовать необязательно, создаёшь Communicator, ObjectAdapter активизируешь их, затем после завершения Qt-ной части выключаешь их.

и одновременно чтобы можно было подсунуть новые данные из остальной части программы на Qt.

Как обычно при передаче данных между объектами в разных потоках.

Begemoth ★★★★★ ()
Ответ на: комментарий от Begemoth

Вызовы методов выполняются на потоках их пула Ice

Стало быть adapter->add(new my_super_class, ... обращения к классу будут вызываться в отдельном потоке, который неявно создается самим Ice? Это я упустил при чтении документации...

Как обычно при передаче данных между объектами в разных потоках.

Как обычно для C++, но не так как было бы приятнее для Qt, наверное.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от UVV

В общем, я передаю ссылку на созданный класс в adapter->add, и также сохраняю ее себе. При отдаче данных клиенту (которая, как утверждается, вызывается из другого потока), и при обновлении данных из основного потока - я использую QMutex + QMutexLocker. Надеюсь я всё правильно делаю... :)

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Как обычно для C++, но не так как было бы приятнее для Qt, наверное.

Кстати, из потоков Ice можно формировать сигналы Qt, а слоты к ним цеплять через Qt::QueuedConnection, может где пригодится.

при обновлении данных из основного потока - я использую QMutex + QMutexLocker. Надеюсь я всё правильно делаю... :)

Ну да. Тут ещё надо помнить, что методы одного объекта могут вызываться в разных потоках. Т.е. два Ice-овских клиента одновременно вызывают методы на одном объекте и эти вызовы не будут сериализоваться автоматически.

Есть ещё Asynchronous Method Dispatch, оно полезно для передачи работы в свои worker threads. В принципе, если методы выполняются быстро (или используют сигналы-слоты т.е. не блокируют Qt-шный event-loop), то работу можно выгрузить в основной Qt-шный поток и не морочаться с синхронизацией.

Begemoth ★★★★★ ()
Последнее исправление: Begemoth (всего исправлений: 2)

Совместить программу на Qt и ZeroC ICE 3.6

Точно так же как объединить программу без Qt с ZeroC ICE :) Варианты — от «слабосвязанной» интеграции через IPC (хотя интеграция с миддлварью через IPC — это «корабль в бутылке в корабле в бутылке» — некоторые архитекторы любят навернуть слоев), до вкручивания ICE сбоку, как любой сторонней либы.

чтобы можно было подсунуть новые данные из остальной части программы на Qt."

Так же как подсовывать данные в поток из основного.

Сам ZeroC ICE предоставляет какие-то свои базовые классы типа Ice::Application

Для мсьей, знающих толк, таки есть вариант использования ICE::Application с прикручиванием Qt сбоку в виде морды, если только она и нужна. (там просто надо прокручивать события Qt руками дергая processEvents() (бонус — можно на любой момент отстегнуть или сменить морду без переделок всего остального, если конечно вся прога сразу не написана на Qt).

slackwarrior ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.