QML类型:WorkerScript

一、描述

使用 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 对象,其他线程对消息中传递的对象所做的任何修改都不会反映在原始对象中。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值