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...