qml demo分析(threading-线程任务)

qml demo分析(threading-线程任务)

大家好,又见面了,我是全栈君。

一、关键类说明

  qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有一个方法,通过该方法可以给js文件中名为WorkerScript.onMessage的方法(在工作线程执行)发送消息,在次接收消息的函数体内部可以通过 WorkerScript.sendMessage的方式在发送消息给WorkerScript内置槽(在主线程执行),WorkerScript类的详细说明如图1所示

qml demo分析(threading-线程任务)

图1 WorkerScript说明

二、示例效果分析

  该示例程序总共包含2个简单的WorkerScript使用方法,分别应用于timedisplay.qml组件和workerscript.qml组件

1、更新视图数据

  如图2所示,是一个WorkerScript的简单使用,qml文件通过WorkerScript对象向js函数发送一个消息,js函数中更新视图内容,消息发送流程:ui线程->工作线程处理(调用接口更新ui)

qml demo分析(threading-线程任务)

图2 更新视图数据

  视图ui文件内容如下,每个2秒钟timer定时器就会触发,通过worker.sendMessage发送消息给js函数,这个js文件是通过WorkerScript对象的source指定,如下第17行代码所示

 1 Rectangle {
 2     color: "white"
 3     width: 200
 4     height: 300
 5 
 6     ListView {
 7         anchors.fill: parent
 8         model: listModel
 9         delegate: Component {
10             Text { text: time }
11         }
12 
13         ListModel { id: listModel }
14 
15         WorkerScript {
   
   //在新线程执行操作,不阻塞ui线程,在父线程使用sendMessage发送消息 在子线程使用onMessage处理
16             id: worker
17             source: "dataloader.js" //加载js文件
18         }
19 
20 // ![0]
21         Timer {
22             id: timer
23             interval: 2000; 
24             repeat: true
25             running: true
26             triggeredOnStart: true//定时器开始执行一次   默认该值为false 定时器开始不执行 等过interval后才执行
27 
28             onTriggered: {
29                 var msg = {
   
   'action': 'appendCurrentTime', 'model': listModel};
30                 worker.sendMessage(msg);//在新线程里执行该操作 不阻塞ui线程 
31             }
32         }
33 // ![0]
34     }
35 }

  对应的js文件dataloader.js比较简单,就一个函数,代码如下

1 WorkerScript.onMessage = function(msg) {
2     if (msg.action == 'appendCurrentTime') {
   
   //如果是指定动作 
3         var data = {
   
   'time': new Date().toTimeString()};//获取当前时间
4         msg.model.append(data);//list添加新数据
5         msg.model.sync();   // 更新数据到ui
6     }
7 }

2、滚轮游戏

  如图3所示,是WorkerScript的一个更复杂的使用,就行文章开头说的那样,消息发送流程:ui线程->工作线程处理->ui线程

qml demo分析(threading-线程任务)

图3 滚轮游戏

  滚轮游戏的代码比较简单,在这里我就贴主要部分

 1 WorkerScript {
 2         id: myWorker
 3         source: "workerscript.js"//指定js文件
 4 
 5         onMessage: {
   
   //接收js文件发送的sendMessage消息
 6             if (messageObject.row == rowSpinner.value && messageObject.column == columnSpinner.value){ //Not an old result
 7                 if (messageObject.result == -1)
 8                     resultText.text = "Column must be <= Row";
 9                 else
10                     resultText.text = messageObject.result;
11             }
12         }
13     }
14 //! [1]
15     Row {
   
   //水平方向上的两个可以滚动的仪表框
16         y: 24
17         spacing: 24
18         anchors.horizontalCenter: parent.horizontalCenter
19 //! [0]
20         Spinner {
21             id: rowSpinner
22             label: "Row"
23             onValueChanged: {
24                 resultText.text = "Loading...";
25                 myWorker.sendMessage( { row: rowSpinner.value, column: columnSpinner.value } );
26             }
27         }
28 //! [0]
29 
30         Spinner {
31             id: columnSpinner
32             label: "Column"
33             onValueChanged: {
34                 resultText.text = "Loading...";
35                 myWorker.sendMessage( { row: rowSpinner.value, column: columnSpinner.value } );
36             }
37         }
38     }

  其中Spinner是自己封装的一个组件,导出了当前文本和当前索引两个属性,对于的js文件如下

 1 var cache = new Array(64);
 2 for (var i = 0; i < 64; i++)
 3     cache[i] = new Array(64);
 4 
 5 function triangle(row, column) {
 6     if (cache[row][column])
 7         return cache[row][column]
 8     if (column < 0 || column > row)
 9         return -1;
10     if (column == 0 || column == row)
11         return 1;
12     return triangle(row-1, column-1) + triangle(row-1, column);
13 }
14 //! [0]  
15 WorkerScript.onMessage = function(message) {
16     //Calculate result (may take a while, using a naive algorithm)
17     var calculatedResult = triangle(message.row, message.column);
18     //Send result back to main thread
19     WorkerScript.sendMessage( { row: message.row,
20                                 column: message.column,
21                                 result: calculatedResult} );
22 }
23 //! [0]

  js文件就不多说了,本篇示例主要就是想分析下WorkerScript的使用,通过上边两种使用方式基本就能理解

转载于:https://www.cnblogs.com/swarmbees/p/6568086.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108614.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 深拷贝和浅拷贝的区别,说法正确的是_前端浅拷贝和深拷贝的区别

    深拷贝和浅拷贝的区别,说法正确的是_前端浅拷贝和深拷贝的区别首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个,而对于对象或者引用数据来说在进行浅拷贝时,只是将对象的引用复制了一份,也就内存地址,即两个不同的变量指向了同一个内存地址,那么在改变任一个变量的值都是该变这个内存地址的所存储的值,所以两个变量的值都会改变。一、clone()方法在Java中是用clone()方法实现深拷贝的,比如以下代码在Jav

  • Dubbo负载均衡策略之 一致性哈希

    Dubbo负载均衡策略之 一致性哈希Dubbo负载均衡策略之一致性哈希1负载均衡在这里引用dubbo官网的一段话——LoadBalance中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如Nginx

  • vue常用组件封装_vue组件全局注册和局部注册

    vue常用组件封装_vue组件全局注册和局部注册项目中肯定会常用的一些基础组件,比如弹窗,toast之类的,要是在每个页面去引入的话那也太麻烦了,还好vue提供了一个全局注册组件的api,即Vue.compoment。在入口文件main.js里import需要的组件,使用Vue.compoment注册即可//src/main.jsimportmodelfrom’@/components/BaseModel’importtoastfrom’@/components/BaseButton’Vue.component(‘BaseMod

  • Gamma校正_c++调试方法

    Gamma校正_c++调试方法voidgamma_correction(cv::Mat&src,cv::Mat&dst,floatK){ ucharLUT[256]; src.copyTo(dst); for(inti=0;i<256;i++){ //floatf=(i+0.5f)/255; floatf=i/255.0; f=pow(f,K); //LUT[i]=cv::saturate_cast<uchar>.

  • 小程序文本内容无法长按复制粘贴_小程序读取剪贴板怎么办

    小程序文本内容无法长按复制粘贴_小程序读取剪贴板怎么办微信小程序的文本,要具有长按复制功能,必须满足两个条件:文本在&lt;text&gt;标签内;&lt;text&gt;标签要有selectable属性。例如:&lt;textselectable=’true’&gt;文本&lt;/text&gt;下面一个例子是,解决WxParse不能长按选择的问题。在wxParse.wxml中修改:diff-…

  • Java基础(面向对象三大特性)

    Java基础(面向对象三大特性)目标:Java基础(面向对象三大特性)文章目录前言Java的三大特性?总结前言JAVA的地位Java具有面向对象、与平台无关、安全、稳定和多线程等优良特性,是目前软件设计中优秀的编程语言。提示:以下是本篇文章正文内容。Java的三大特性?1.封装性面向对象编程的核心思想之一是将数据的操作封装在一起。通过抽象,即从具体的实例中抽取出共同的性质形成一班的概念,例如类的概念。例如把生活中的一些行为称作是它们具有的方法,而属性是它们的状态描述,仅仅用属性或行为不能很好地描述它们。人们经常谈.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号