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

鸿蒙:使用worker实现多线程通信

前言:

我们还是老样子,跟着官方文档学习与实践,链接如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/worker-introduction#worker%E8%BF%90%E4%BD%9C%E6%9C%BA%E5%88%B6https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/worker-introduction#worker%E8%BF%90%E4%BD%9C%E6%9C%BA%E5%88%B6看了文档,我们就来练一练,本人的练习效果图和代码如下:

代码如下:

1、Index.ets

import { init, postMessage, onMessage } from '../workers/WorkerUtil';@Entry
@Component
struct Index {@State message: string = '使用worker发送消息';build() {Column({ space: 30 }) {Text("使用worker触发弹窗").fontSize(30).fontWeight(FontWeight.Bold).onClick(() => {init(this.getUIContext())onMessage()postMessage("展示弹窗")})Text(this.message).fontSize(30).fontWeight(FontWeight.Bold).onClick(() => {onMessage()postMessage(" 番茄")postMessage(" 鼠标")postMessage(" 键盘")postMessage(" 数据线")})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}

2、WorkUtil.ets

import { MessageEvents, worker } from "@kit.ArkTS";// 创建Worker对象
let workerInstance = new worker.ThreadWorker('entry/ets/workers/worker.ets');export let UIContextInstance: UIContext | undefinedexport function init(uiContext: UIContext) {// 获取UIContext对象UIContextInstance = uiContext;
}export function onMessage() {// 注册onmessage回调,捕获宿主线程接收到来自其创建的Worker通过workerPort.postMessage接口发送的消息。该回调在宿主线程执行workerInstance.onmessage = (e: MessageEvents) => {let data: string = e.data;console.info('workerInstance onmessage is: ', data);if (UIContextInstance && data == "使用worker发送消息展示弹窗") {UIContextInstance.showAlertDialog({ message: data })}}
}export function postMessage(data: string) {// 发送消息给Worker线程workerInstance.postMessage(data);
}

3、worker.ets

// worker.ets
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';const workerPort: ThreadWorkerGlobalScope = worker.workerPort;// 注册onmessage回调,当Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用,在Worker线程执行
workerPort.onmessage = (e: MessageEvents) => {let data: string = e.data;console.info('workerPort onmessage is: ', data);// 向宿主线程发送消息workerPort.postMessage('使用worker发送消息' + data);
}// 注册onmessageerror回调,当Worker对象接收到一条无法被序列化的消息时被调用,在Worker线程执行
workerPort.onmessageerror = () => {console.error('workerPort onmessageerror');
}// 注册onerror回调,捕获Worker在执行过程中发生的异常,在Worker线程执行
workerPort.onerror = (err: ErrorEvent) => {console.error('workerPort onerror err is: ', err.message);
}

以上是个人经验分享。

http://www.dtcms.com/a/391592.html

相关文章:

  • Spring MVC 常用注解及代码示例
  • 【DMA】DMA入门:外设数据到内存,以串口DMA接收为例,解析底层实现
  • Java 中 super 和 this关键字总结
  • 我的创作纪念日 ----- 第512天
  • 【docker】删除镜像
  • 亚马逊 MWS 关键字 API 实战:关键字搜索商品列表接口深度解析与优化方案
  • 博文干货 | Pulsar 平均负载器(AvgShedder)
  • 【硬件】嘉立创专业版layout流程(一)
  • PyQt6之分组框
  • 深度剖析 IM 单聊与群聊架构设计
  • 农业自动化:技术重塑传统农业的新范式
  • Nginx 日志文件在哪?
  • 小程序开发者转多端应用app调整视频播放功能
  • 九、Java-注解
  • Java学习笔记——AI插件、新建模块、算数运算符类型、隐式转换、强制转换、自增自减运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符
  • 【从零开始刷力扣006】leetcode206
  • FreeRTOS——介绍及移植过程
  • Day 07 Physics list-----以B1为例
  • 重读一次IS015765-2,记录对错误和异常处理的方式
  • Edge浏览器CSDN文章编辑时一按shift就乱了(Edge shift键)欧路翻译问题(按Shift翻译鼠标所在段落)
  • SpringIoc 基础练习 验证码
  • 前端项目,CDN预热有什么用?
  • TF卡的存储数据结构—fat32格式
  • led的带宽在模拟太阳光中设备中的影响
  • go资深之路笔记(三) sync.WaitGroup, sync.errgroup和 sync.go-multierror
  • Docker 与数据库环境
  • Node.js 模块系统详解
  • proxy代理应用记录
  • 基于python大数据的汽车数据分析系统设计与实现
  • WebSocket实现原理