HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?

HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?

cke_175.png

文档只写了说明,示例代码也完全没有体现,在worker的onMessage里如何拿到这个arrayBuffer数组? MessageEvents里的data是第一个参数sendable对象


更多关于HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

个人理解这个应该是用于切换发送对象所在的线程(从宿主到worker),发送的内容就是message,取的时候也是在onMessage取。如果不需要切换对象所在线程,那么这个值(transfer)不需要传递,否则就将其(message[object])序列化后转为ArrayBuffer传递。

更多关于HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


首先感谢回答。

sendable对象应该是在shared heap?所以似乎不是某个线程单独所有的吧,所有线程都可访问,实现多线程间传递。

那这第二个参数起到什么作用呢?

其实我现在主要问题是,我有一个图像帧的ArrayBuffer,需要传递给子worker处理,但找不到解决方案,sendable只支持collections.ArrayBuffer

在HarmonyOS鸿蒙Next中,Worker postMessage传递sendable对象时,第二个ArrayBuffer参数会以独立拷贝形式传递到子线程。子线程通过监听message事件获取数据:

workerPort.onmessage = (e: MessageEvents) => {
  const [sendableObj, arrayBuffer] = e.data; // 直接解构获取两个参数
  // arrayBuffer即为传递的ArrayBuffer数据
};

两个参数会以数组形式打包在e.data中,按传递顺序排列。ArrayBuffer在子线程中是可用的独立拷贝,与原线程数据不共享内存空间。

在HarmonyOS Next的Worker线程通信中,要获取postMessage传递的第二个ArrayBuffer数组参数,可以通过MessageEventarrayBuffer属性访问。具体实现如下:

主线程发送示例:

const buffer1 = new ArrayBuffer(8);
const buffer2 = new ArrayBuffer(16);
worker.postMessage({type: "data"}, [buffer1, buffer2]); 

Worker线程接收示例:

worker.onmessage = (e: MessageEvent) => {
  const obj = e.data; // 第一个参数{type: "data"}
  const buffers = e.arrayBuffer; // 第二个参数ArrayBuffer数组
  const buffer1 = buffers[0]; // 第一个ArrayBuffer
  const buffer2 = buffers[1]; // 第二个ArrayBuffer
};

关键点:

  1. postMessage第二个参数必须是ArrayBuffer数组
  2. 在Worker线程通过MessageEvent.arrayBuffer属性获取
  3. arrayBuffer返回的是传递的ArrayBuffer数组的拷贝

注意:这种方式只适用于ArrayBuffer类型的传输,其他类型数据需要放在第一个参数对象中传递。

回到顶部