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

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

HarmonyOS
2024-05-28 21:37:11
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fujiang1981
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线程函数
409浏览 • 1回复 待解决
通过emitter实现worker线程通讯
432浏览 • 1回复 待解决
Worker线程内存如何共享
954浏览 • 1回复 待解决
如何创建一个worker线程
398浏览 • 1回复 待解决
TaskPool线程和主线程如何通信
898浏览 • 1回复 待解决
Worker和TaskPool的线程数量是否有限制
766浏览 • 1回复 待解决
Worker线程的使用,有谁知道啊?
474浏览 • 1回复 待解决
父组件调用组件的方法
470浏览 • 1回复 待解决
HarmonyOS可以在C代码中创建线程吗?
1345浏览 • 1回复 待解决
利用native接口实现一个圆角矩形
565浏览 • 1回复 待解决