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 *
的成员变量。 d
在 QQuickWorkerScriptEngine
处理的线程中 运行ning(参见 QQuickWorkerScriptEngine
构造函数中的 d->moveToThread(this)
)。正是这个 d
将有效地 运行 QQuickWorkerScriptEnginePrivate::event()
中的异步工作。
PS
这种说法与 Qt documentation 相矛盾:
Use WorkerScript to run operations in a new thread.
这可能会让您认为每个 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 *
的成员变量。 d
在 QQuickWorkerScriptEngine
处理的线程中 运行ning(参见 QQuickWorkerScriptEngine
构造函数中的 d->moveToThread(this)
)。正是这个 d
将有效地 运行 QQuickWorkerScriptEnginePrivate::event()
中的异步工作。
PS
这种说法与 Qt documentation 相矛盾:
Use WorkerScript to run operations in a new thread.
这可能会让您认为每个 WorkerScript
都是一个新线程。