鸿蒙开发-woeker实例

177 阅读1分钟

接上期鸿蒙开发-多线程并发我们继续开发work实例

worker初体验

image.png

运行结果

image.png

实现代码

WorkerPage.ets

import { worker } from '@kit.ArkTS'

@Entry
@Component
struct WorkerPage {
  build() {
    Column() {
      Button('测试worker')
        .onClick(() => {
          // 创建线程
          const threadWorker = new worker.ThreadWorker('../workers/Worker')
          // 发送消息
          threadWorker.postMessage({
            sourcePath: '源路径',
            zipPath: '压缩路径',
          })
          // 接收消息
          threadWorker.onmessage = (e) => {
            console.log('threadWorker onmessage: ' + JSON.stringify(e.data))
          }
        })

    }
    .height('100%')
    .width('100%')
  }
}

src/main/ets/workers/Worker.ets

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';

const workerPort: ThreadWorkerGlobalScope = worker.workerPort;

/**
 * 定义当工作线程接收到主线程发送的消息时调用的事件处理程序。
 * 该事件处理程序在工作线程中执行。
 *
 * @param e 消息数据
 */
workerPort.onmessage = (e: MessageEvents) => {
  console.log(`收到消息`, JSON.stringify(e))
  workerPort.postMessage({ msg: '压缩成功', zipPath: e.data.zipPath })
  workerPort.close()
}

/**
 * 定义当工作线程接收到无法反序列化的消息时调用的事件处理程序。
 * 该事件处理程序在工作线程中执行。
 *
 * @param e 消息数据
 */
workerPort.onmessageerror = (e: MessageEvents) => {
}

/**
 * 定义当工作线程执行过程中发生异常时调用的事件处理程序。
 * 该事件处理程序在工作线程中执行。
 *
 * @param e 错误信息
 */
workerPort.onerror = (e: ErrorEvent) => {
}