原文: https://doc.qt.io/qt-5/qml-qtqml-workerscript-workerscript.html

实现Qt Quick应用中使用线程

导入声明:import QtQml.WorkerScript 2.15

  • ready: bool
  • source: url
  • message (jsobject msg)
  • sendMessage (jsobject message)

详细描述:

在一个新的线程中使用WorkerScript执行操作。这有利于不阻断主GUI线程,并在后台运行操作。

信息可以在线程间传递。父线程用sendMessage(),新线程用onMessage()处理接收。

一个例子:

import QtQuick 2.0
Rectangle {
    width: 300; height: 300
    Text {
        id: myText
        text: 'Click anywhere'
    WorkerScript {
        id: myWorker
        source: 'script.mjs'
        onMessage: myText.text = messageObject.reply
    MouseArea {
        anchors.fill: parent
        onClicked: myWorker.sendMessage({ 'x': mouse.x, 'y': mouse.y })

上面的worker script 指定了一个 JavaScript 文件——“script.mjs”。用于在新线程中执行操作。

下面是 script.mjs:

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

当用户点击Rectangede 任意位置,sendMessage()函数会被调用。触发script.mjs中的 WorkerScript.onMessage()处理程序。script.mjs中的WorkerScript.onMessage()又发送一个回应信息,最后被myWorker的onMessage()处理程序接收到。

这个例子使用的是ECMAScript模式的脚本文件,因为后缀名是.mjs。它可以使用import声明,导入其他模块,访问其他模块的函数功能,并且在严格模式下运行。

如果使用后缀名为.js的附加脚本,那么就是一个纯JavaScript声明文件,并且非严格模式执行。

注意:每一个WorkerScript 元素都会实例化一个单独的JavaScript引擎来确保完全的隔离性和线程安全。如果这种机制对你的运行环境造成过高的内存消耗,可以考虑共享WorkerScript元素。

限制条件:

因为WorkerScript.onMessage()函数是在一个独立的线程中执行,所以JavaScript文件是与主QML引擎完全剥离的上下文中评估检测的。这意味着不像被引入QML的普通JavaScript文件。上例中的script.mjs不能访问QML中的属性,方法或其他属性,也不能通过QQmlContext访问任何OML对象上下文中的属性。

此外,附加的JS脚本参数传递的参数类型也是有限制的。详情查阅下面的方法文档中sendMessage详细说明。

如果附加脚本是一个纯的JavaScript脚本,不可以使用.import语法。相反,符合ECMAScript模式的脚本可以自由的使用import和export声明。

详情查阅Qt Quick Examples - Threading 和 Threaded ListModel Example.

属性文档:

ready: bool

保存WorkerScript是否已经实例化,并准备通过WorkerScript.sendMessage()接收信息。

source: url

保存实现WorkerScript.onMessage()处理线程操作的附加JavaScript文件地址。

如果url中的文件名组成以".mjs"为后缀,说明脚本已经设置为严格模式并符合ECMAScript标准。否则只是一个简单脚本。

信号文档:

message (jsobject msg)

从另一个线程中的工作脚本接收到消息msg时,就会调用sendMessage()发射信号。

注意:对应的处理程序是onMessage。

方法文档:

sendMessage (jsobject message)

向另一个线程中的工作脚本发送已经初始化的message。另一个线程中的工作脚本可以通过onMessage()处理器接收此message。

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

  • boolean, number, string
  • JavaScript 对象 和 数组
  • ListModel 对象(不允许任何其他QObject*类型)

所有对象和数组都会拷贝给message。除了ListModel对象以外,其他参数在传递过程中,另一个线程中的任何修改,都不会污染原始数据。

原文:https://doc.qt.io/qt-5/qml-qtqml-workerscript-workerscript.html实现Qt Quick应用中使用线程导入声明:import QtQml.WorkerScript 2.15属性:ready: bool source: url信号:message (jsobject msg)方法:sendMessage (jsobject message)详细描述:在一个新的线程中使用WorkerScript... 使用 WorkerScript 在新线程中运行操作。这对于在后台运行操作很有用,这样主 GUI 线程就不会被阻塞。 可以使用 sendMessage() 和 onMessage() 处理程序在新线程和父线程之间传递消息。 一个例子: import QtQuick 2.9 import QtQuick.Window 2.2 Window visible: true width: 840 height: 600 Rectangle
JavaScript资源可以由QML文档和其他JavaScript资源导入。JavaScript资源可以通过相对或绝对URL导入。如果是相对URL,则相对于包含导入的QML文档或JavaScript资源的位置来解析位置。如果脚本文件不可访问,将发生错误。如果需要从网络资源中获取JavaScript,则在下载脚本之前,组件的状态将设置为“正在加载”。 JavaScript资源也可以导入QML模块和...
QML界面卡顿时也可以采用线程的方法。下面提供二个思路: 1.Qt提供了一个WorkerScript来将脚本中的执行的函数放到一个线程中执行。WorkerScript用于生成新的线程,并通过消息进行通信。自行查看Qt的帮助文档,有相关例子。 网站https://doc.qt.io/qt-5/qtquick-threading-example.html 2.采用C++中的QT... QQmlApplicationEngine engine; QScopedPointer<myHttpRequest> myHttprequest(new myHttpRequest(runMode)); engine.rootContext()->setContextProperty("myHttprequest",myHttpreque
Qt提供了许多用于处理线程的类和函数。 Qt程序员可以使用以下四种不同的方法来实现多线程应用程序。 QThread:具有可选事件循环的低级API QThread是Qt中所有线程控制的基础。每个QThread实例代表并控制一个线程。 QThread可以直接实例化也可以子类化。实例化QThread提供了一个并行事件循环,从而允许在辅助线程中调用QObject槽。子类化QThread允许应用程序在开始其事件循环之前初始化新线程,或者在没有事件循环的情况下允许并行代码 有关如何使用QThread的演示,请参见QTh
官方描述:在一个Qt Quick应用程序中可以使用线程了. Import Statement: import QtQuick .属性:source : url信号:message(jsobject msg) 使用WorkerScript在一个新线程中执行操作.再后台执行操作是很有用的,主GUI线程也不会锁定. Message可以在新线程和父线程之间通过sendMess...