#鸿蒙通关秘籍#如何利用Native线程安全函数实现鸿蒙跨线程调用?

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
DB幻影刺客

要实现鸿蒙开发中的跨线程调用,利用 napi_threadsafe_function 是一个有效的方法。首先,创建一个可以在线程间共享使用的函数,用它将数据从子线程传回到主线程中,主线程随后会调用 JavaScript 回调函数进行处理。

c++ napi_threadsafe_function tsfn;

void ThreadSafeCallJs(napi_env env, napi_value js_cb, void *context, void *data) { CallbackContext *argContent = (CallbackContext *)data; if (argContent) { napi_get_reference_value(env, argContent->callbackRef, &js_cb); napi_valuetype valueType; napi_typeof(env, js_cb, &valueType); if (valueType == napi_function) { napi_value argv; napi_create_int32(env, g_cValue, &argv); napi_call_function(env, nullptr, js_cb, 1, &argv, nullptr); } napi_delete_reference(env, argContent->callbackRef); delete argContent; } }

napi_value ThreadSafeTest(napi_env env, napi_callback_info info) { napi_value js_cb; napi_get_cb_info(env, info, 1, &js_cb, nullptr, nullptr); napi_value workName; napi_create_string_utf8(env, "workItem", NAPI_AUTO_LENGTH, &workName); napi_create_threadsafe_function(env, js_cb, NULL, workName, 0, 1, NULL, NULL, NULL, ThreadSafeCallJs, &tsfn);

return nullptr;

}

void StartThreads() { for (int i = 0; i < g_threadNum; ++i) { auto context = new CallbackContext(); std::thread t([context] { napi_acquire_threadsafe_function(tsfn); napi_call_threadsafe_function(tsfn, context, napi_tsfn_nonblocking); }); t.detach(); } }

该方法会在 ThreadSafeCallJs 中执行传入的 JavaScript 回调,确保线程安全。


分享
微博
QQ
微信
回复
1天前
相关问题
NAPI线程调用TS线程函数
1183浏览 • 1回复 待解决
如何实现线程数据共享
249浏览 • 1回复 待解决
Native rdb写入是否有线程安全管理
1861浏览 • 1回复 待解决
ArkTs多线程方案如何保证线程安全
2559浏览 • 2回复 待解决