单个应用程序中 QJSEngine 的多个实例?
Multiple instances of QJSEngine within a single app?
单个 C++/Qt5 应用程序具有多个独立的 JavaScript 引擎实例是否正常?在我的应用程序中,我有几个 QObject 继承的对象,它们充当独立的数据处理单元。在它们中的每一个中,我都希望能够启动 JS 脚本,并且我希望这些脚本的上下文在这些单元之间是独立的。最简单的想法是让每个单元都有自己的 QJSEngine 实例。一个简单的测试表明,如果我在同一个应用程序中创建两个引擎并在其中一个中设置自定义全局 属性,则第二个引擎不知道这个 属性,这正是我想要的。但是仍然不明显的是,没有一些 QJSEngine 的所有实例共有的全局状态属性。 Qt 官方文档中似乎从未提及多个实例的问题。这足以得出拥有多个实例不会造成问题的结论吗?
Qt 文档通常是明确的,因此如果禁止创建 2 QJSEngine
,它会写在文档中,并且您会在 run-time 处收到警告或断言失败。
例如,如果您尝试创建 2 个 QCoreApplication
实例,您最终会因错误而崩溃:
ASSERT failure in QCoreApplication: "there should be only one application object", file kernel\qcoreapplication.cpp, line 792
由于 QJSEngine
没有这样的 notice/warning/assert,创建多个实例应该是绝对安全的。
如果您还想知道这是允许的,可以查看 QQuickWidget
。如果需要,此小部件将创建自己的 QQmlEngine
(即 QJSEngine
),无论是否存在任何其他 QJSEngine
或 QQmlEngine
实例。
单个 C++/Qt5 应用程序具有多个独立的 JavaScript 引擎实例是否正常?在我的应用程序中,我有几个 QObject 继承的对象,它们充当独立的数据处理单元。在它们中的每一个中,我都希望能够启动 JS 脚本,并且我希望这些脚本的上下文在这些单元之间是独立的。最简单的想法是让每个单元都有自己的 QJSEngine 实例。一个简单的测试表明,如果我在同一个应用程序中创建两个引擎并在其中一个中设置自定义全局 属性,则第二个引擎不知道这个 属性,这正是我想要的。但是仍然不明显的是,没有一些 QJSEngine 的所有实例共有的全局状态属性。 Qt 官方文档中似乎从未提及多个实例的问题。这足以得出拥有多个实例不会造成问题的结论吗?
Qt 文档通常是明确的,因此如果禁止创建 2 QJSEngine
,它会写在文档中,并且您会在 run-time 处收到警告或断言失败。
例如,如果您尝试创建 2 个 QCoreApplication
实例,您最终会因错误而崩溃:
ASSERT failure in QCoreApplication: "there should be only one application object", file kernel\qcoreapplication.cpp, line 792
由于 QJSEngine
没有这样的 notice/warning/assert,创建多个实例应该是绝对安全的。
如果您还想知道这是允许的,可以查看 QQuickWidget
。如果需要,此小部件将创建自己的 QQmlEngine
(即 QJSEngine
),无论是否存在任何其他 QJSEngine
或 QQmlEngine
实例。