利用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主线程 
  }); 
}

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);
分享
微博
QQ
微信
回复
2024-05-29 22:51:44
相关问题
NAPI线程调用TS线程函数
1209浏览 • 1回复 待解决
如何在Worker中开启多级线程
330浏览 • 1回复 待解决
通过emitter实现worker线程通讯
982浏览 • 1回复 待解决
Worker线程如何销毁?
378浏览 • 1回复 待解决
Worker线程内存如何共享
2306浏览 • 1回复 待解决
Worker的宿主线程必须是主线程吗?
414浏览 • 1回复 待解决
HarmonyOS napi 接口线程安全咨询
332浏览 • 1回复 待解决
TaskPool线程和主线程如何通信
2329浏览 • 1回复 待解决