Приложение Qt доступно нескольким пользователям через интерфейс веб-браузера - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть приложение, реализованное в Qt с некоторыми интегрированными модулями c ++ и python (машинное обучение, обработка сигналов и т. Д.) Со следующими основными характеристиками:

  1. Внутренние многопоточные модули, которые могут работатьпараллель (QThread)
  2. Предоставление характеристик визуализации, таких как 2D-графики ( не отправка изображений ) через виджеты Qt, например, QwtPlotZoomer, QwtPlotMarker, QGraphicsRectItem, QwtPlotCurve.

Моя цель - предоставить уже реализованные характеристики приложения сервера, на котором запущено приложение, через веб-браузер с несколькими пользователями-наблюдателями.Я провел некоторые исследования и обнаружил некоторые возможные решения (Qt WebGL, Qt for Assembly, Wt ) по следующим ссылкам ( ссылка , ссылка , link и link ), но как неопытный разработчик веб-приложений я не совсем уверен, какой из этих или альтернативных и предпочтительных C++ модулей использовать.

Можете ли вы предоставить некоторые предложения и рекомендации по использованию библиотеки веб-разработки, основанные на таких характеристиках, как зрелость, возможности, простота использования и зрелость (гибкость с виджетами Qt), но также учитывайте характеристикимоего приложения?

Заранее спасибо.

PS: Я хотел бы упомянуть, помогает ли мне этот опыт в C ++ и Python, а не в Java и Javascript.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Если вы хотите создать приложение, которое может обслуживать несколько клиентов с помощью Qt, есть 3 основных варианта:

Плагин платформы Qt WebGL

Это создаст чисто серверную сторонуреализации и просто отображать графический интерфейс удаленно в браузере.Это кажется самым простым подходом, но имеет несколько ограничений и недостатков:

  1. Одновременно может обслуживаться только один клиент.Эту проблему можно обойти, создав приложение «spawner», которое ожидает поступления трафика и запускает новый экземпляр для каждого подключенного клиента.Однако это требует некоторой дополнительной логики и требует значительных ресурсов
  2. Высокая нагрузка на сеть.Особенно интерактивные графические интерфейсы могут использовать до 40 Мбит / с на клиента !
  3. Нет логики клиента.Просто невозможно добавить клиентский код в этой настройке

Все вместе этот метод никогда не был разработан для такого случая использования.Он предназначен для использования в качестве графического интерфейса для безголовых устройств или доступа для технического обслуживания.Я бы не рекомендовал бы его использовать.

Серверное приложение + Qt для WebAssembly

Разделите ваше приложение на две части: серверное приложение и клиентское приложение.Клиентское приложение с Qt для WebAssembly.Связь между ними может осуществляться с помощью QtWebSockets, QtRemoteObjects или других решений Network-IPC.

Это дает вам преимущество в использовании только одного языка и делает IPC очень простым, поскольку обе стороныиспользуйте Qt.Кроме того, в WASM гораздо более эффективные задачи для вычислений.Однако Qt для WebAssembly все еще находится в техническом состоянии предварительного просмотра и, следовательно, еще не стабилен.Например, он пока не поддерживает многопоточность или сокеты TCP / IP.Кроме того, не все конечные устройства поддерживают WASM на данный момент.

Серверное приложение + HTML WebApp

Последний подход заключается в смешивании технологий.Используйте Web-Framework, такой как Cutelyst , чтобы создать веб-сервер на основе Qt и обслуживать с ним классический веб-сайт HTML.Вы можете использовать QtWebChannel для простой передачи данных между вашим Qt-сервером и HTML-клиентом.


Решение между WASM и HTML-клиентом остается за вами.Использование WASM может быть проще для вас, но у него есть свои проблемы.Я бы порекомендовал вам сделать еще несколько исследований на обоихЗатем создайте несколько тестовых приложений для обоих решений и сравните их, чтобы выяснить, какое из них лучше всего соответствует вашим потребностям

0 голосов
/ 11 февраля 2019

На самом деле я думаю, что есть только одна главная вещь: если он начинает падать, вам, вероятно, понадобится один из них:

https://doc.qt.io/qt-5/qmutex.html

Что касается веб-сценариев, я склонен использовать QWebEnginePage::runJavaScript() предлагая предостережение, что это не легко.Причина в том, что при внедрении javascript из C ++ вы имеете дело с однопоточной линейной средой из c ++, которая сильно затрудняет время и точку внедрения кода.По сути, это ад из состояния гонки, и serviceable model, который я разработал, просто запускает скрипт до получения желаемого результата.

https://doc.qt.io/qt-5/qwebenginepage.html#runJavaScript

Это означает, что это хорошо дляделегировать задачи надежным приложениям javascript.

Наконец, поскольку вы работаете с Qt, полезно разработать мышление «Создайте все как API».

...