HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?
HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?
文档只写了说明,示例代码也完全没有体现,在worker的onMessage里如何拿到这个arrayBuffer数组? MessageEvents里的data是第一个参数sendable对象
更多关于HarmonyOS鸿蒙Next中Worker postMessage传递sendable对象时,也传递第二个arraybuffer的数组参数,在子线程怎么拿到?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
个人理解这个应该是用于切换发送对象所在的线程(从宿主到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
数组参数,可以通过MessageEvent
的arrayBuffer
属性访问。具体实现如下:
主线程发送示例:
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
};
关键点:
postMessage
第二个参数必须是ArrayBuffer
数组- 在Worker线程通过
MessageEvent.arrayBuffer
属性获取 arrayBuffer
返回的是传递的ArrayBuffer
数组的拷贝
注意:这种方式只适用于ArrayBuffer
类型的传输,其他类型数据需要放在第一个参数对象中传递。