codecamp

使用Worker进行线程间通信

Worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。

Worker的开发步骤如下:

  1. 在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息。

    1. "buildOption": {
    2. "sourceOption": {
    3. "workers": [
    4. "./src/main/ets/workers/worker.ts"
    5. ]
    6. }
    7. }
  2. 根据build-profile.json5中的配置创建对应的worker.ts文件。

    1. import worker from '@ohos.worker';
    2. let parent = worker.workerPort;
    3. // 处理来自主线程的消息
    4. parent.onmessage = function(message) {
    5. console.info("onmessage: " + message)
    6. // 发送消息到主线程
    7. parent.postMessage("message from worker thread.")
    8. }
  3. 主线程中使用如下方式初始化和使用worker。

    • Stage模型:

      1. import worker from '@ohos.worker';
      2. let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");
      3. // 发送消息到worker线程
      4. wk.postMessage("message from main thread.")
      5. // 处理来自worker线程的消息
      6. wk.onmessage = function(message) {
      7. console.info("message from worker: " + message)
      8. // 根据业务按需停止worker线程
      9. wk.terminate()
      10. }
    • FA模型:

      1. import worker from '@ohos.worker';
      2. let wk = new worker.ThreadWorker("../workers/worker.ts");
      3. // 发送消息到worker线程
      4. wk.postMessage("message from main thread.")
      5. // 处理来自worker线程的消息
      6. wk.onmessage = function(message) {
      7. console.info("message from worker: " + message)
      8. // 根据业务按需停止worker线程
      9. wk.terminate()
      10. }

说明:

  • build-profile.json5中配置的worker.ts的相对路径都为./src/main/ets/workers/worker.ts时,在Stage模型下创建worker需要传入路径entry/ets/workers/worker.ts;在FA模型下创建worker需要传入路径../workers/worker.ts。

  • 主线程与Worker线程间支持的数据类型参考序列化支持类型

使用Emitter进行线程间通信
方舟开发框架(ArkUI)概述
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录
HAR

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }