WorkerScript QML 类型

允许在 Qt Quick 应用中使用线程。 更多信息...

导入语句import QtQml.WorkerScript

属性

信号

方法

详细描述

使用 WorkerScript 在新线程中运行操作。这在后台运行操作以防止主 GUI 线程阻塞时非常有用。

可以使用 sendMessage() 和 onMessage() 处理器在新线程和父线程之间传递消息。

示例

import QtQuick

Rectangle {
    width: 300; height: 300

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

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

        onMessage: (messageObject)=> myText.text = messageObject.reply
    }

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

上面的工作脚本指定了一个位于新线程中要执行操作的 JavaScript 文件,"script.mjs"。以下是 script.mjs

WorkerScript.onMessage = function(message) {
    // ... long-running operations and calculations are done here
    WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
}

当用户在矩形内点击任何地方时,将调用 sendMessage(),触发 script.mjs 中的 WorkerScript.onMessage() 处理器。这接着发送一个回复消息,然后由 myWorkeronMessage() 处理器接收。

这个示例使用了一个 ECMAScript 模块作为脚本,因为它具有 ".mjs" 扩展名。它可以使用导入语句来访问来自其他模块的功能,并且它在 JavaScript 严格模式下运行。

如果工作脚本具有 ".js" 扩展名,则认为它包含纯 JavaScript 语句,并且在非严格模式下运行。

注意:每个 WorkerScript 元素将实例化一个单独的 JavaScript 引擎,以确保完美的隔离和线程安全。如果这样做对您的环境来说内存消耗太高,那么请考虑共享一个 WorkerScript 元素。

限制

由于 WorkerScript.onMessage() 函数在单独的线程中运行,JavaScript 文件是在与主 QML 引擎不同的上下文中评估的。这意味着,与导入到 QML 中的普通 JavaScript 文件不同,上述示例中的 script.mjs 无法访问 QML 物品的属性、方法或其他属性,也不能通过 QQmlContext 访问在 QML 对象上设置的任何上下文属性。

此外,对可以传递到工作脚本和从工作脚本返回的值的类型有一些限制。有关详细信息,请参阅 sendMessage() 的文档。

纯JavaScript源码的Worker脚本不能使用 .import 语法。ECMAScript模块的脚本可以自由使用导入和导出语句。

属性文档

ready : bool [只读]

此属性表示 WorkerScript 是否已初始化并准备好通过 WorkerScript.sendMessage() 接收消息。


source : url

此属性包含实现 WorkerScript.onMessage() 处理程序的JavaScript文件的URL。

如果URL的文件名部分以 ".mjs" 结尾,则脚本作为ECMAScript模块解析并在严格模式下运行。否则被认为是纯脚本。


信号文档

message(jsobject msg)

当通过调用 sendMessage() 接收到来自另一个线程的Worker脚本的 msg 消息时,发出此信号。

注意:相应的处理程序是 onMessage


方法文档

sendMessage(jsobject message)

将给定的 message 发送到另一个线程的Worker脚本处理程序。另一个Worker脚本处理程序可以通过 onMessage 处理程序接收此消息。

message 对象只能包含以下类型的值

  • 布尔值、数字、字符串
  • JavaScript对象和数组
  • ListModel对象(禁止其他类型的 QObject 指针)

所有对象和数组都会复制到 message 中。除ListModel对象外,任何其他线程对 (message) 中传递的对象的修改都不会反映在原始对象中。


© 2024 Qt公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档受 GNU自由文档许可版本1.3 的条款许可,由自由软件基金会发布。Qt以及相应的标志是芬兰和/或世界其他地区的Qt公司的商标。所有其他商标均为其各自所有者的财产。