利用worker子线程调用napi实现loop改写变量

在特定场景,比如Native多线程处理消息计算等,需要用napi的loop完成消息循环,但是又不想阻塞UI主线程。

HarmonyOS
2024-05-28 21:37:11
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
她是猫鳄鱼
1

使用的核心API

1. napi_create_async_work:是Node-API接口之一,用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应性能。

2. napi_queue_async_work:将异步工作对象加到队列,由底层去调度执行。

3. napi_get_uv_event_loop:获取当前libuv loop实例。

4. napi_add_env_cleanup_hook:注册环境清理钩子函数。

参考链接:Node-API支持的数据类型和接口

核心代码解释

ArkTS侧:

if (this.state == 1) { 
    Prompt.showToast({ message: "请勿重复点击" })   // worker 数量限制,最多8个 
    return 
} 
this.state = 1 
let worker1:worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets', { name: "worker1" }); 
worker1.postMessage('this is a msg to start worker1');      // js主线程发生消息给worker 
worker1.onmessage = (e:MessageEvents) => {      // 监听 worker中的消息 
    this.progress = e.data.data as number 
    this.message = String(this.progress) 
    console.log('=====js main, process is:' + this.message) 
    if (this.progress == 100) { 
    worker1.terminate() 
    this.state = 0 
    } 
} 
  
workerPort.onmessage = (e: MessageEvents) => { 
  testNapi.mainthread((data:ESObject)=>{        // 调用napi 
    console.log("==worker func:data is :" + data)    // 28249-28290 
    workerPort.postMessage({ 'type': 1, "data": data }); // 实时传递进度给js主线程 
  }); 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

Native侧:

// worker主线程销毁的时候回调,完成new 内存释放 
auto func = [](void * asyncContext) { delete asyncContext; OH_LOG_INFO(LOG_APP, "====== call env clean up"); }; 
napi_add_env_cleanup_hook(asyncContext->env, func, asyncContext); 
  
// 获取 context->env 上下文环境的 loop (线程池) 
napi_get_uv_event_loop(context->env, &loop);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
分享
微博
QQ
微信
回复
2024-05-29 22:51:44
相关问题
NAPI线程调用TS线程函数
2429浏览 • 1回复 待解决
如何在Worker中开启多级线程
1021浏览 • 1回复 待解决
HarmonyOS worker线程在har包里不生效
749浏览 • 1回复 待解决
通过emitter实现worker线程通讯
1842浏览 • 1回复 待解决
HarmonyOS huks支持线程调用吗?
649浏览 • 1回复 待解决
Worker线程如何销毁?
872浏览 • 1回复 待解决
Worker线程内存如何共享
3080浏览 • 1回复 待解决
Worker的宿主线程必须是主线程吗?
1164浏览 • 1回复 待解决