一、描述
使用 WorkerScript 在新线程中运行操作。这对于在后台运行操作很有用,这样主 GUI 线程就不会被阻塞。
可以使用 sendMessage() 和 onMessage() 处理程序在新线程和父线程之间传递消息。
一个例子:
import QtQuick 2.9
import QtQuick.Window 2.2
Window
{
visible: true
width: 840
height: 600
Rectangle
{
anchors.fill: parent
Text
{
id: myText
text: '单击任何位置'
}
WorkerScript
{
id: myWorker
source: "qrc:/script.mjs"
onMessage: function(messageObject)
{
myText.text = messageObject.reply
}
}
MouseArea
{
anchors.fill: parent
onClicked: function(mouse)
{
myWorker.sendMessage({ 'x': mouse.x, 'y': mouse.y })
}
}
}
}
指定了一个 JavaScript 文件“script.mjs”,它处理要在新线程中执行的操作。
script.mjs
WorkerScript.onMessage = function(message)
{
WorkerScript.sendMessage({ 'reply': '鼠标位置:' + message.x + ',' + message.y })
}
当用户单击矩形内的任意位置时,将调用 sendMessage(),触发 script.mjs 中的 WorkerScript.onMessage() 处理程序。这反过来发送一条回复消息,然后由 myWorker 的 onMessage() 处理程序接收。
每个 WorkerScript 元素都会实例化一个单独的 JavaScript 引擎,以确保完美的隔离和线程安全。
因为WorkerScript.onMessage() 函数在单独的线程中运行,所以上例中的 script.mjs 无法访问 QML 项的属性、方法。
二、属性成员
1、ready : bool
WorkerScript 是否已初始化并准备好通过 WorkerScript.sendMessage() 接收消息。
2、source : url
为线程操作实现 WorkerScript.onMessage() 处理程序的 JavaScript 文件的 url。
如果 url 的文件名部分以“.mjs”结尾,则脚本被解析为 ECMAScript 模块并以严格模式运行。 否则,它被认为是纯脚本。
三、信号成员
1、message(jsobject msg)
通过调用 sendMessage() 从另一个线程中的工作脚本接收到消息 msg 时,会发出此信号。
四、成员函数
1、sendMessage(jsobject message)
将给定的消息发送到另一个线程中的工作脚本处理程序。另一个工作脚本处理程序可以通过 onMessage() 处理程序接收此消息。
message 对象只能包含以下类型的值:
- 布尔值、数字、字符串
- JavaScript 对象和数组
- ListModel 对象(不允许使用任何其他类型的 QObject*)
所有对象和数组都被复制到消息中。除了 ListModel 对象,其他线程对消息中传递的对象所做的任何修改都不会反映在原始对象中。