libuv的简单实现,通过使用libuv库实现C++子线程操作

libuv的简单实现

HarmonyOS
2024-05-23 22:03:12
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
sheeny2000

本示例通过使用libuv库实现C++子线程操作

使用的核心API

napi_get_uv_event_loop

核心代码解释

struct CallbackContext { 
   // JS N-API 上下文环境 
   napi_env env = nullptr; 
   // JS 回调函数引用,保证 JS 主线程结束时,回调函数不被销毁 
   napi_ref callbackRef = nullptr; 
   // 获取数据 
   int retData = 0; 
}; 
​ 
// 子线程任务 
void subthread(CallbackContext *context) { 
   uv_loop_s *loop = nullptr; 
   // 获取 context->env 上下文环境的 loop (线程池) 
   napi_get_uv_event_loop(context->env, &loop); 
​ 
   // uv_work_t 是关联 loop 和 线程池回调函数的结构体 
   uv_work_t *work = new uv_work_t; 
   work->data = (CallbackContext *)context; 
​ 
   while (context && context->retData < 100) { 
       uv_queue_work( 
           loop, work, [](uv_work_t *work) {}, 
          [](uv_work_t *work, int status) { 
               CallbackContext *context = (CallbackContext *)work->data; 
               context->retData += 1; 
               napi_handle_scope scope = nullptr; 
               // 管理 napi_value 的生命周期,防止内存泄露 
               napi_open_handle_scope(context->env, &scope); 
               napi_value callback = nullptr; 
               napi_get_reference_value(context->env, context->callbackRef, &callback); 
               napi_value retArg; 
               napi_create_int32(context->env, context->retData, &retArg); 
               napi_value ret; 
               // napi_call_function 调用 JS 侧回调 
               napi_call_function(context->env, nullptr, callback, 1, &retArg, &ret); 
​ 
               napi_close_handle_scope(context->env, scope); 
               if (context->retData > 99) { 
                  // delete context; 
                   //delete work; 
              } 
          }); 
       // 控制 while 循环每 100 毫秒执行一次。 
       std::this_thread::sleep_for(std::chrono::milliseconds(100)); 
  } 
}; 
​ 
// JS 主线程 
static napi_value mainthread(napi_env env, napi_callback_info info) { 
   size_t argc = 1; 
   napi_value args[1] = {0}; 
   napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
   auto asyncContext = new CallbackContext(); 
   asyncContext->env = env; 
   napi_create_reference(env, args[0], 1, &asyncContext->callbackRef); 
   // 启动子线程 
   std::thread testThread(subthread, asyncContext); 
   testThread.detach(); 
   return nullptr; 
};

实现效果


适配的版本信息

IDE:DevEco Studio 4.0.1.601

SDK:HarmoneyOS 4.0.10.11

分享
微博
QQ
微信
回复
2024-05-24 21:51:05
相关问题
基于libuv异步进行线程通信
737浏览 • 0回复 待解决
通过Native 调用c++实现文本绘制
489浏览 • 1回复 待解决
如何实现ArkTS与C/C++数组转换
15浏览 • 1回复 待解决
如何实现ArkTS与C/C++HashMap转换?
497浏览 • 0回复 待解决
C++ 如何获取操作 Arkts 实例
435浏览 • 1回复 待解决
如何实现ArkTS与C/C++对象传递
28浏览 • 1回复 待解决
AVPlayer实现音频播放(c++侧)
469浏览 • 1回复 待解决
woeker及taskpool简单实现
372浏览 • 1回复 待解决
通过emitter实现worker间线程通讯
456浏览 • 1回复 待解决
如何使用taskpool实现线程
550浏览 • 1回复 待解决
如何简单实现相机关闭
201浏览 • 1回复 待解决