0%

WorkerScript属性说明

使用WorkerScript在新线程中运行操作。这对于在后台运行操作非常有用,因此不会阻止主GUI线程。

本文: https://www.lovejia.win/blog/article/WorkerScript.html
参考原文:http://doc.qt.io/qt-5/qml-workerscript.html
参考译文:http://blog.csdn.net/icebergkevin/article/details/50133337

属性说明

source : url

它保存了WorkerScript.onMessage()实现线程操作处理程序的JavaScript文件的url 。

信号说明

message(jsobject msg)

当通过对sendMessage()的调用从另一个线程中的工作者脚本接收到消息msg时,发出此信号。
相应的处理程序是onMessage。

方法说明

sendMessage(jsobject message)

将给定消息发送到另一个线程中的工作程序脚本处理程序。另一个工作者脚本处理程序可以通过onMessage()处理程序接收此消息。
该message对象只能包含以下类型的值:
1、布尔,数字,字符串
2、JavaScript对象和数组
3、ListModel对象(任何其他类型的QObject *是不允许的)
所有对象和数组都复制到message。除了ListModel对象之外,其他线程对传入的对象的任何修改message都不会反映在原始对象中。

功能简述

使用WorkerScript在新线程中运行操作。这对于在后台运行操作非常有用,因此不会阻止主GUI线程。
可以使用sendMessage()和onMessage()处理程序在新线程和父线程之间传递消息。
由于WorkerScript.onMessage()函数在单独的线程中运行,因此在与主QML引擎分离的上下文中评估JavaScript文件。这意味着,与导入到QML中的普通JavaScript文件不同,script.js上面的示例不能访问QML项的属性,方法或其他属性,也不能通过QQmlContext访问在QML对象上设置的任何上下文属性。
此外,对可以传递给worker脚本和从worker脚本传递的值的类型有限制。

下面的例子使用WorkerScript在新线程中运行操作,鼠标点击窗口中的某一个位置,程序中的那行文本便会更新当前鼠标的XY坐标:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import QtQuick 2.0
Rectangle {
width: 300; height: 300

Text {
id: myText
text: 'Click anywhere'
}

WorkerScript {
id: myWorker
source: "script.js"

onMessage: myText.text = messageObject.reply
}

MouseArea {
anchors.fill: parent
onClicked: myWorker.sendMessage({ 'x': mouse.x, 'y': mouse.y })
}
}

上述工作程序脚本指定了一个JavaScript文件“script.js”,它处理要在新线程中执行的操作。这里是script.js:

1
2
3
4
WorkerScript.onMessage = function(message) {
// ...长时间运行的操作和计算在这里完成
WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
}

当用户单击矩形内的任何位置时,sendMessage()被调用,触发WorkerScript.onMessage()处理程序script.js。这反过来发送回复消息,然后由onMessage()处理程序接收myWorker。

------本文结束    感谢阅读------
你打赏你的,我分享我的!