请教各位关于arkui中HarmonyOS 鸿蒙Next线程问题

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

请教各位关于arkui中HarmonyOS 鸿蒙Next线程问题 我想要在ui层起一个线程不断的去获取图像数据,然后丢到canvas中显示(可以认为这个线程里面是一个死循环,直到进程结束),我尝试使用了worker功能, 在worker.ts里面收到UI发过来的消息后去执行while(true), UI层直接挂了, 应该是sendMessage会阻塞主进程处理。arkts中有没有类似android里面的Thread功能,或者worker里面能做到类似的处理吗? (另外arkui里面定时器的处理方式也有尝试,不能满足目前的需求,所以想要通过线程的方式处理)

cke_8682.png


更多关于请教各位关于arkui中HarmonyOS 鸿蒙Next线程问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

如果在工作线程里,一直通过while循环处理消息,并且给UI线程发送,那么会阻塞UI主线程,造成Thread_Block,看下是否可以在worker中通过定时器的方式给UI线程发送数据,示例代码如下:

workerPort.onmessage = (e: MessageEvents) => {
  const type = e.data.type as string;
  if (type === 'start') {
    if (!isRunning) {
      isRunning = true;
      // 开始常驻任务
      performTask();
    }
  } else if (type === 'stop') {
    isRunning = false;
    workerPort.close();  // 关闭Worker
  }
}
// 模拟常驻任务
function performTask() {
  if (isRunning) {
    workerPort.postMessage('Worker is performing a task');
    // 1秒后再次执行任务
    setTimeout(performTask, 1000);
  }
  workerPort.postMessage('Worker is stop performing a task');
}

更多关于请教各位关于arkui中HarmonyOS 鸿蒙Next线程问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个方式可以使用,非常感谢,顺便问下在arkts里面没有类似直接new thread,然后直接在thread里面处理的方式吗?这种靠定时器的方式+ worker的方式,处理的时候感觉好奇怪,图像都拿到后然后在worker里面还要封装下发送出去,然后在UI线程里面再解密获取,就是感觉明明可以很简单的拿到,为啥要这么多次一举处理。

当前鸿蒙下的多线程有taskpool和worker两种方式,可以参考官网的多线程并发:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/multithread-concurrency-V5,但无论哪种方式,都要注意工作线程和UI主线程的交互频率,不能长时间阻塞主线程。

好的,多谢,

Worker就是运行在工作线程中的,不是UI线程。

你这个问题是,你在工作线程中死循环发消息,那么UI线程要接受消息,意味着UI线程就一直不断接受消息,造成了阻塞,你是把耗时操作放到了Worker中,也把耗时操作放到了UI中。

感谢回复,确实,我不调用那个poseMessage就可以正常使用,

那请问我有什么办法可以在ets中使用一个线程不断的调用native c++层接口获取数据然后送显?类似 while(true) (getImage();)

点击下按钮然后发送消息到worker.ts,将接收和发送的功能都改成异步的方式也没有作用,还是会导致UI阻塞超时,然后挂了

cke_1771.png

cke_2082.png

在arkui中处理HarmonyOS鸿蒙Next线程问题时,主要涉及的是如何在UI线程(也称为主线程)和后台线程之间安全、有效地进行交互。

HarmonyOS鸿蒙系统中,UI更新必须在UI线程中执行,而耗时操作(如网络请求、文件读写等)则应在后台线程中进行,以避免阻塞UI线程,导致应用界面卡顿。

在arkui中,你可以使用@Env注解和@Message注解来管理线程间的通信。@Env注解用于获取当前的环境信息,包括线程信息,而@Message注解则用于在不同组件或不同线程间发送消息。

如果你需要在后台线程中完成某项任务,并在任务完成后更新UI,可以通过发送消息到UI线程来实现。这通常涉及到定义一个消息类型,并在UI线程中监听该类型的消息,当收到消息时执行相应的UI更新操作。

请注意,由于arkui和HarmonyOS鸿蒙系统的不断更新,具体的线程管理策略和API可能会有所变化。因此,在处理线程问题时,建议查阅最新的官方文档或API参考,以确保你的代码与当前的系统版本兼容。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部