QML:WorkerScript 的线程模型

pmf*_*pmf 2 concurrency qt worker qml

使用 QML 时WorkerScript,请求(通过 发送postMessage())是否排队(并在单个处理程序线程上执行),或者是否有可能/危险postMessage()在两个线程上同时执行两个连续的线程?

Ben*_*n T 5

简答

所有的WorkerScript都应该在同一个线程中执行。

不是那么简短的回答

所有WorkerScript在 aQQmlEngine应该在同一个线程中执行。

长答案

当您WorkerScript在 QML 中创建 a 时,您将实例化QQuickWorkerScriptC++ 类。这个类使用QQuickWorkerScriptEngine该类来处理所有线程的事情。

现在,如果您查看QQuickWorkerScript::engine()并且QQmlEnginePrivate::getWorkerScriptEngine()您将看到所有WorkerScript对象都将共享相同的QQuickWorkerScriptEngine实例,只要它们共享相同的QQmlEngine.

也是QQuickWorkerScriptEngine一个QThread(公共继承)并包含一个名为dtype的成员变量QQuickWorkerScriptEnginePrivate *d通过处理的线程运行QQuickWorkerScriptEngine(见d->moveToThread(this)QQuickWorkerScriptEngine构造函数)。正是这一d点将有效地运行QQuickWorkerScriptEnginePrivate::event().

聚苯乙烯

这种与Qt 文档相矛盾的是:

使用 WorkerScript 在新线程中运行操作。

这可能会让您认为每个WorkerScript都是一个新线程。