HarmonyOS Worker线程可收到宿主线程消息,宿主线程无法收到Worker线程消息?

宿主线程创建并注册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的消息

阅读 390
1 个回答

并非接收不到Worker返回的消息,是在当前线程中使用while(true)死循环阻塞当前线程导致的。

可尝试将myWorker当作成员变量,并在点击按钮时调用setInterval注册定时调用myWorker.postMessage发送消息

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进