宿主线程创建并注册Worker三个回调
- onmessageerror
- onmessage
- onerror
代码说明:
while循环向Worker线程间隔1000ms发送消息1
Worker线程收到来自宿主线程消息后发送响应消息2
期望行为:宿主线程收到Worker发送的消息后打印日志
实际行为:Worker线程有收到来自宿主的消息,宿主线程无法收到Worker线程通过workerPort.postMessage发送的消息
Worker线程
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import hilog from '@ohos.hilog'
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
/**
* Defines the event handler to be called when the worker thread receives a message sent by the host thread.
* The event handler is executed in the worker thread.
*
* @param e message data
*/
workerPort.onmessage = (e: MessageEvents) => {
hilog.debug(0, "WorkerTest", "recv msg from host")
workerPort.postMessage(2)
}
/**
* Defines the event handler to be called when the worker receives a message that cannot be deserialized.
* The event handler is executed in the worker thread.
*
* @param e message data
*/
workerPort.onmessageerror = (e: MessageEvents) => {
}
/**
* Defines the event handler to be called when an exception occurs during worker execution.
* The event handler is executed in the worker thread.
*
* @param e error message
*/
workerPort.onerror = (e: ErrorEvent) => {
}
宿主线程
@Concurrent
function sendMessage() {
let myWorker = new worker.ThreadWorker("../workers/Worker")
myWorker.onmessageerror = (event: MessageEvents) => {
hilog.debug(0x00, "WorkerTest", "onmessageerror from worker")
}
myWorker.onmessage = (e: MessageEvents) => {
hilog.debug(0x00, "WorkerTest", "onmessage from worker")
}
myWorker.onerror = (err: ErrorEvent) => {
hilog.debug(0x00, "WorkerTest", "onerror from worker")
}
while (true) {
myWorker.postMessage(1)
let sharedBuf = new SharedArrayBuffer(4)
let sharedArr = new Int32Array(sharedBuf)
Atomics.wait(sharedArr, 0, 0, 1000)
}
}
日志结果
仅Worker线程收到消息有打印了日志,宿主线程未收到来自Worker的消息
并非接收不到Worker返回的消息,是在当前线程中使用while(true)死循环阻塞当前线程导致的。
可尝试将myWorker当作成员变量,并在点击按钮时调用setInterval注册定时调用myWorker.postMessage发送消息