单个应用程序中有多个 QJSEngine 实例?

Posted

技术标签:

【中文标题】单个应用程序中有多个 QJSEngine 实例?【英文标题】:Multiple instances of QJSEngine within a single app? 【发布时间】:2019-06-27 09:05:25 【问题描述】:

单个 C++/Qt5 应用拥有多个独立的 javascript 引擎实例是否正常?在我的应用程序中,我有几个 QObject 继承的对象,它们充当独立的数据处理单元。在它们中的每一个中,我都希望能够启动 JS 脚本,并且我希望这些脚本的上下文在这些单元之间是独立的。最简单的想法是让每个单元都有自己的 QJSEngine 实例。一个简单的测试表明,如果我在同一个应用程序中创建两个引擎并在其中一个中设置自定义全局属性,则第二个引擎不知道该属性,这正是我想要的。但是仍然不明显的是,没有一些全局状态属性对所有 QJSEngine 实例都是通用的。官方 Qt 文档中似乎从未提及多实例的问题。是否足以得出多个实例没有问题的结论?

【问题讨论】:

澄清一下:我在这里发现一个可能的问题的原因是实例化 QJSEngine 需要首先构造 QCoreApplication(或其派生类)。但是对于单个应用程序,可能只有 one 个 QCoreApplication 实例,正如 Qt 文档中所强调的那样。这也让我对 QJSEngine 有点怀疑:) 【参考方案1】:

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),而不管是否存在任何其他QJSEngineQQmlEngine 实例。

【讨论】:

以上是关于单个应用程序中有多个 QJSEngine 实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何清理或销毁 QJSEngine?

CMMotionManager 的多个实例,确定更新间隔

调整单个页面中多个 ag-grid 实例的所有列的大小

在单个 AppDomain 上运行多个应用程序实例时如何防止属性覆盖?

单个节点上的 Service Fabric 无状态服务部署

QJSEngine 全局字符串比较