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

Worker多线程的使用

HarmonyOS
2024-05-26 17:48:11
1272浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
一意孤行的

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.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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%') 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
分享
微博
QQ
微信
回复
2024-05-27 22:36:19
相关问题
有谁知道flexBasis使用问题
1739浏览 • 1回复 待解决
有谁知道常用AppFreeze使用指导
2205浏览 • 1回复 待解决
JSVM使用示例,有谁知道吗?
2157浏览 • 1回复 待解决
有谁知道常用hdc命令使用指导
3568浏览 • 1回复 待解决
有谁知道asset api调用失败怎么办?
2435浏览 • 1回复 待解决
有谁知道如何生成UUID
2523浏览 • 1回复 待解决
有谁知道如何创建 JSONObject
1144浏览 • 1回复 待解决
有谁知道应用升级方式
2578浏览 • 1回复 待解决
有谁知道如何使用hdc命令截屏
4457浏览 • 2回复 待解决
有谁知道可以直接使用so库吗?
2202浏览 • 1回复 待解决
有谁知道地图无瓦片是什么原因
3042浏览 • 1回复 待解决
有谁知道如何主动关闭应用
2870浏览 • 1回复 待解决
有谁知道如何理解栅格布局
1350浏览 • 1回复 待解决
有谁知道沙箱目录怎么获取
3567浏览 • 1回复 待解决
有谁知道Image图片取反色
3113浏览 • 1回复 待解决
有谁知道如何计算文本宽度
2972浏览 • 1回复 待解决
vp、fp、px区别,有谁知道
3697浏览 • 1回复 待解决
有谁知道Menu菜单触发方式
2855浏览 • 1回复 待解决
有谁知道如何注册app页面
956浏览 • 1回复 待解决
有谁知道如何强制退出app?
1010浏览 • 1回复 待解决
有谁知道如何监听屏幕旋转
2818浏览 • 1回复 待解决