Несколько экземпляров QJSEngine в одном приложении? - PullRequest
2 голосов
/ 27 июня 2019

Нормально ли для одного приложения C ++ / Qt5 иметь несколько независимых экземпляров движка JavaScript? В моем приложении у меня есть несколько объектов, унаследованных от QObject, которые действуют как независимые блоки обработки данных. В каждом из них я хочу иметь возможность запускать JS-скрипты, и я хочу, чтобы контексты этих скриптов были независимыми среди этих модулей. Самая простая идея состоит в том, чтобы каждый из модулей имел свой собственный экземпляр QJSEngine. Простой тест показывает, что если я создаю два движка в одном приложении и устанавливаю настраиваемое глобальное свойство в одном из них, это свойство не известно второму движку, чего я и хочу. Но все же не очевидно, что не существует каких-либо глобальных свойств состояния, которые являются общими для всех экземпляров QJSEngine. Вопрос о множественных экземплярах, кажется, никогда не упоминается в официальных документах Qt. Достаточно ли этого, чтобы заключить, что наличие нескольких экземпляров не создает проблем?

1 Ответ

1 голос
/ 28 июня 2019

Документация Qt, как правило, является явной, поэтому, если будет запрещено создавать 2 QJSEngine, это будет записано в документации, и вы получите предупреждение или ошибку подтверждения во время выполнения.

Например, если вы попытаетесь создать 2 QCoreApplication экземпляра, вы получите сбой с ошибкой:

ASSERT failure in QCoreApplication: "there should be only one application object", file kernel\qcoreapplication.cpp, line 792

Поскольку таких уведомлений / предупреждений / утверждений для QJSEngine нет, создание нескольких экземпляров должно быть абсолютно безопасным.

Если вам нужен еще один совет о том, что это разрешено, вы можете посмотреть на QQuickWidget. Этот виджет создаст свой собственный QQmlEngine (т. Е. QJSEngine), если необходимо, независимо от существования любого другого экземпляра QJSEngine или QQmlEngine.

...