当前位置: 首页 > news >正文

Worker线程的使用

1.概念

创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。

2.作用

Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。

3.创建Woker线程

export interface MessageDownload {work: stringContext?: Context
}// 1.监听worker线程的消息
workerPort.onmessage = (e: MessageEvents) => {//2.定义要执行的任务 : 下载文件const data = e.data as MessageDownloadif (data.work === 'start') {downloadFile(data.Context as Context)}
}// 下载文件
async function downloadFile(Context: Context) {const task = await request.downloadFile(Context, {url: 'https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_package_901_9/c1/v3/Jnel8gI8R1WszYSI3QKjLw/devecostudio-windows-5.0.3.900.zip?HW-CC-KV=V1&HW-CC-Date=20241019T022307Z&HW-CC-Expire=7200&HW-CC-Sign=E61763FE291FC1859C36F71D0396384908FF1F88A8AF4CB8DA7F47AE01236F58',filePath: Context.cacheDir + '/test.zip'})task.on('progress', (current, total) => {const progress = (current / total * 100).toFixed(2) + '%'// 4.通知页面:消息的内容必须是可序列化对象workerPort.postMessage({progress})if (current === total) {workerPort.close()}})
}

4.新建页面,创建Worker任务

import { worker } from '@kit.ArkTS'
import { MessageDownload } from '../../workers/Worker'@Entry
@Component
struct WorkerCase {@Stateprogress: string = '0%'myWorker?: worker.ThreadWorkercreateWorker() {// 1.创建worker任务//路径规范:模块名/worker文件夹/Worker文件名.etsconst myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets')this.myWorker = myWorker//3.页面通知worker开始下载myWorker.postMessage({work: 'start',Context: getContext()})//5.页面接收worker进度信息myWorker.onmessage = (e) => {this.progress = e.data.progress as string}}testWorker() {try {this.myWorker?.postMessage({work: 'test'} as MessageDownload)} catch (e) {console.error(e)}}build() {Column({ space: 10 }) {Text('下载速度:' + this.progress)Button('下载DevEco Studio').onClick(() => {this.createWorker()})Button('关闭Worker线程').onClick(() => {this.testWorker()})}.height('100%').width('100%').padding(50)}
}

5.代码实现图片


http://www.mrgr.cn/news/53707.html

相关文章:

  • React Strict DOM:React Native 通用应用程序的未来
  • SpringBoot使用RestTemplate实现发送HTTP请求
  • Python爬虫:urllib_post请求百度翻译(06)
  • QTableWidget如何在header中添加一个复选框(含源码)
  • CSV文件自动化生成:用Pandas与Datetime高效处理商品信息
  • 版本工具报错:Error Unity Version Control
  • 【贪心算法】(第三篇)
  • ECCV‘24 | WTConv:小参数大感受野,基于小波变换的新型卷积
  • 一款能让产品兼容所有快充协议的快充取电芯片
  • IRMV Lab新作:Mamba Diffusion模型实现高精度2D手部轨迹预测
  • 【最新华为OD机试E卷-支持在线评测】找单词(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)
  • cefsharp 84.4.10(Chromium 84.0.4147.105)支持H264视频播放-PDF预览 老版本回顾系列体验
  • vue3处理货名的拼接
  • 腾讯云短信服务(Java)
  • MicroPython rp2-LVGL 固件编译记录
  • python-PyQt项目实战案例:制作一个视频播放器
  • Windows 内核层内存泄漏查看工具
  • 利用GPU训练
  • 浏览器实时更新esp32-c3 Supermini http server 数据
  • Spring的起源与发展
  • python办公:批量PDF合并—通用版
  • 【最新华为OD机试E卷-支持在线评测】模拟目录管理 (200分)多语言题解-(Python/C/JavaScript/Java/Cpp)
  • React入门简介
  • Win11电脑快捷键大全
  • Python配合yolov11开发对象检测软件
  • 青城山道观:清幽之境,心灵之旅