Worker多线程的使用,有谁知道啊?

Worker多线程的使用

HarmonyOS
2024-05-26 17:48:11
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
lilyglp

Worker多线程的使用

Worker线程独立于UI主线程,可以使用Worker线程来处理某些阻塞性又耗时的动作,来避免UI界面出现卡顿等现象。

创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程

Worker使用简要流程:

1. 在宿主线程中新建Worker线程,然后调用worker.postMessage方法发送消息至Worker线程。

2. Worker线程执行完成后,通过调用parentPort.onmessage方法返回执行结果。

以下介绍具体的使用案例:

宿主线程将无序的字符数组发送给Worker线程进行排序(模拟耗时的动作),然后Worker线程将排序后的数组发送给宿主线程进行显示。

1. 创建Worker线程ts文件。

2. 本教程在pages目录下创建一个workers目录,然后新建一个workers.ts文件。

3. Worker线程能接受宿主线程传递来的信息,执行完成后,可以将结果返回给宿主线程。

worker.js文件中定义parentPort.onmessage方法来接收宿主线程发送的消息。// worker.ts 
// 导入worker模块 
import workers from '@ohos.worker' 
// 获取parentPort属性 
const parentPort = workers.parentPort 
const TAG = 'JsWorker.worker' 
parentPort.onmessageerror = function (e) { 
  // e.data即宿主线程postMessage传输的数据 
  let data = e.data 
  console.info(`${TAG} onmessageerror:${JSON.stringify(data)}`) 
} 
// 接收宿主线程的消息 
parentPort.onmessage = function (e) { 
  let data = e.data 
  console.info(`${TAG} onmessage:${JSON.stringify(data)}`) 
  if (data.objType == 'normal') { 
    let obj = data.data 
    console.info(`${TAG} postMessage obj: ${obj}`) 
    // 对数据进行分割和排序 
    let after = obj.split(",").sort() 
    console.info(`${TAG} postMessage after: ${after}`) 
    data.data = after 
    // 将处理好的数据返回给宿主线程 
    parentPort.postMessage(data) 
  } 
}

1. 配置打包路径。

2. build-profile.json5文件中添加打包路径。

// 本教程worker路径:./src/main/ets/pages/workers/worker.ts。// build-profile.json5 
{ 
  "apiType": 'stageMode', 
  "buildOption": { 
    "sourceOption": { 
      "workers": [ 
        "./src/main/ets/pages/workers/worker.ts" 
      ] 
    } 
  }, 
  ... 
}

1. 宿主线程中创建Worker线程。

2. 宿主线程中新建Worker线程,需要指定worker.ts文件路径。

本教程路径:entry/ets/pages/workers/worker.ts。

//宿主线程中定义worker.onmessage方法来接收Worker线程发送的消息。import worker from '@ohos.worker' 
const TAG = 'WorkerTest' 
@Entry 
@Component 
struct WorkerTest { 
  @State message: string = '启动worker排序' 
  @State before: Array<string> = [] 
  @State after: Array<string> = [] 
  worker: worker.Worker = new worker.Worker("entry/ets/pages/workers/worker.ts", { 
    name: "worker_test" 
  }) 
 
 
  aboutToAppear() { 
    console.info(`${TAG} on onInit`) 
    this.before = ["b", "c", "d", "a"] 
    // Worker异常时回调 
    this.worker.onerror = (data) => { 
      console.info(`${TAG} test on error: ${JSON.stringify(data)}`) 
    } 
    // Worker退出时回调 
    this.worker.onexit = (data) => { 
      console.info(`${TAG} test on exit: ${JSON.stringify(data)}`) 
    } 
    // 接受Worker线程返回的数据时回调 
    this.worker.onmessage = (e) => { 
      let data = e.data 
      if (data.objType == 'normal') { 
        console.info(`${TAG} test normal: ${data.data}`) 
        this.after = data.data 
      } 
    } 
  } 
 
 
  build() { 
    Row() { 
      Column() { 
        Text(`排序前:${this.before.toString()}`) 
          .fontSize(30) 
        Button(this.message) 
          .fontSize(40) 
          .onClick(() => { 
            console.info(`${TAG} test sendString`) 
            let obj = { 
              objType: "normal", 
              data: this.before.toString() 
            } 
            console.info(`${TAG} sendString: ${obj.data}`) 
            // 发送原始数据给Worker线程 
            this.worker.postMessage(obj) 
          }) 
        Text(`排序后:${this.after.toString()}`) 
          .fontSize(30) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
分享
微博
QQ
微信
回复
2024-05-27 22:36:19
相关问题
有谁知道flexBasis使用问题
430浏览 • 1回复 待解决
有谁知道常用AppFreeze使用指导
207浏览 • 1回复 待解决
JSVM使用示例,有谁知道吗?
407浏览 • 1回复 待解决
有谁知道常用hdc命令使用指导
882浏览 • 1回复 待解决
有谁知道应用升级方式
650浏览 • 1回复 待解决
有谁知道如何生成UUID
463浏览 • 1回复 待解决
有谁知道可以直接使用so库吗?
461浏览 • 1回复 待解决
有谁知道如何使用hdc命令截屏
1064浏览 • 2回复 待解决
有谁知道asset api调用失败怎么办?
419浏览 • 1回复 待解决
有谁知道如何计算文本宽度
698浏览 • 1回复 待解决
vp、fp、px区别,有谁知道
715浏览 • 1回复 待解决
有谁知道沙箱目录怎么获取
805浏览 • 1回复 待解决
有谁知道Image图片取反色
713浏览 • 1回复 待解决
有谁知道如何主动关闭应用
609浏览 • 1回复 待解决
有谁知道地图无瓦片是什么原因
703浏览 • 1回复 待解决
有谁知道Menu菜单触发方式
665浏览 • 1回复 待解决
有谁知道如何获取IMEI码
648浏览 • 1回复 待解决
有谁知道如何屏蔽触摸事件
448浏览 • 1回复 待解决
有谁知道an\ai文件是什么
524浏览 • 1回复 待解决
有谁知道是否支持帧动画
718浏览 • 1回复 待解决
有谁知道如何监听屏幕旋转
652浏览 • 1回复 待解决