关于HarmonyOS 鸿蒙Next TaskPool传参问题

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

关于HarmonyOS 鸿蒙Next TaskPool传参问题

let task: taskpool.LongTask = new taskpool.LongTask(fdFunc, imageData.readBuffer,
  Math.floor(msg.contentWidth),Math.floor(msg.contentHeight));
emitter.on("fd", (data: emitter.EventData) => {
 console.info 'sampleTag', "name is : " + data.data?.faceInfoList?.length);
 emitter.off("fd")
 taskpool.terminateTask(task)
})
taskpool.execute(task);

@Concurrent
function fdFunc(data:ArrayBuffer,width:number,height:number) {
 let uint8Data = new Uint8Array(data)
 console.info('data',uint8Data,width,height)
}

尝试传入arraybuffer 但也能打印出uint8Data信息,但似乎数据导致的结果不太对,换成worker这么传会提示无法被序列化的消息

workerInstance.postMessage({data:imageData.readBuffer,width:Math.floor(msg.contentWidth),height:Math.floor(msg.contentHeight)});

TaskPool和worker传参是这么使用吗?


更多关于关于HarmonyOS 鸿蒙Next TaskPool传参问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

给的例子可以执行,还有问题的话,得打开看看对imageData.readBuffer干了啥

import { taskpool } from '@kit.ArkTS';
import { emitter } from '@kit.BasicServicesKit';

@Concurrent
function fdFunc(data: ArrayBuffer, width: number, height: number) {
  let ua = new Uint8Array(data);
  ua[0] = 0;
  ua[1] = 0;
  ua[2] = 0;
  ua[3] = 0;
  console.log('[index] width =' + width + ', height = ' + height);
  for (let i = 0; i < ua.byteLength; i++) {
    console.log('[index] ' + ua[i]);
  }
  emitter.emit("fd", {
    data: {
      faceInfoList: ua
    }
  })
}

@Entry
@Component
struct Index {
  build() {
    Button('click').onClick(() => {
      let ua = new Uint8Array(4);
      ua[0] = 1;
      ua[1] = 1;
      ua[2] = 1;
      ua[3] = 1;
      let readBuffer = ua.buffer as ArrayBuffer;
      let task: taskpool.LongTask = new taskpool.LongTask(fdFunc, readBuffer,
        10, 20);
      task.setCloneList([readBuffer]);

      emitter.on("fd", (data: emitter.EventData) => {
        console.info("[index]eventdata = " + JSON.stringify(data));
        emitter.off("fd");
        taskpool.terminateTask(task);
        // 不调用setCloneList的话,使用转移模式,ua会变成undefined;调用setCloneList,对象转移使用拷贝模式,子线程和主线程都仍然能访问ua
        for (let i = 0; i < ua.byteLength; i++) {
          console.log('[index]2 ' + ua[i]);
        }
      })
      taskpool.execute(task);
    });
  }
}

更多关于关于HarmonyOS 鸿蒙Next TaskPool传参问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


worker的问题,按照接口文档,第1个参数要可序列化:

可序列化的类型如下:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-worker-V5#序列化支持类型

taskpool入参可以使用arraybuffer,默认是转移模式。您给的例子我试了,没有什么问题。

排错的话,建议

  1. taskpool内把arraybuffer长度打印出来看看,有没有变化,是不是跟主线程一致

  2. 加上如下代码,看看有没有改善

task.setCloneList(imageData.readBuffer);

在HarmonyOS鸿蒙系统中,Next TaskPool传参问题主要涉及任务间数据传递的机制。HarmonyOS提供了高效的任务调度和消息传递机制,用于在TaskPool(任务池)中的任务之间安全地传递参数。

对于Next TaskPool传参,通常使用以下几种方式:

  1. 全局变量或共享内存:这种方式适用于任务间需要频繁读写共享数据的场景,但需注意同步和互斥,以防止数据竞争。

  2. 消息队列:通过消息队列,任务可以发送和接收包含参数的消息。这种方式解耦了任务间的依赖,提高了系统的灵活性和可扩展性。

  3. 任务参数结构体:在创建任务时,将参数封装在结构体中,并通过任务创建接口传递给新任务。这种方式结构清晰,参数管理方便。

  4. 特定API支持:HarmonyOS可能提供了特定的API用于任务间传参,这些API通常封装了底层通信机制,简化了开发者的工作。

请确保在使用上述方式时,遵循HarmonyOS的编程规范和内存管理原则,以避免内存泄漏或数据不一致等问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。在此页面上,您可以找到专业的客服团队,他们将为您提供进一步的帮助和支持。

回到顶部