QML:WorkerScript 的线程模型

QML: threading model for WorkerScript

当使用 QML WorkerScript 时,请求(通过 postMessage() 发送)是否已排队(并在单个处理程序线程上执行)或者 possibility/danger 两个连续的 postMessage()会在两个线程上并发执行吗?

简答

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

不要这么简短的回答

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

长答案

当您在 QML 中创建 WorkerScript 时,您会实例化 QQuickWorkerScript C++ class。这个 class 使用 QQuickWorkerScriptEngine class 来处理所有线程。

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

另外 QQuickWorkerScriptEngine 是一个 QThread(public 继承)并且包含一个名为 d 类型 QQuickWorkerScriptEnginePrivate * 的成员变量。 dQQuickWorkerScriptEngine 处理的线程中 运行ning(参见 QQuickWorkerScriptEngine 构造函数中的 d->moveToThread(this))。正是这个 d 将有效地 运行 QQuickWorkerScriptEnginePrivate::event() 中的异步工作。

PS

这种说法与 Qt documentation 相矛盾:

Use WorkerScript to run operations in a new thread.

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