相关问题
#鸿蒙通关秘籍#在鸿蒙中如何使用N-API实现线程安全的跨线程函数调用?
37浏览 • 1回复 待解决
NAPI跨线程调用TS线程函数
1183浏览 • 1回复 待解决
#鸿蒙通关秘籍#AKI和NAPI在跨线程调用JS函数中有哪些区别?
70浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何使用AKI实现C++跨线程调用JS函数,并进行加10操作?
45浏览 • 0回复 待解决
#鸿蒙通关秘籍#在鸿蒙体系中通过线程安全函数的线程管理实现无阻滞界面体验
25浏览 • 1回复 待解决
#鸿蒙通关秘籍#使用ArkTS实现跨线程任务调度
37浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在HarmonyOS NEXT中利用异步线程实现Native侧的进度通知功能?
92浏览 • 0回复 待解决
#鸿蒙通关秘籍#鸿蒙中如何实现普通对象的跨线程传递?
48浏览 • 1回复 待解决
如何在C++子线程调用ArkTS方法?(线程安全)
1340浏览 • 1回复 待解决
新线程中调用的函数没返回,怎么结束线程?
2403浏览 • 1回复 待解决
#鸿蒙通关秘籍#鸿蒙应用中如何使用UI主线程调用多线程方法?
54浏览 • 1回复 待解决
#鸿蒙通关秘籍#鸿蒙开发中如何确保多线程环境下的N-API调用安全?
27浏览 • 1回复 待解决
利用worker子线程调用napi实现loop改写变量
989浏览 • 1回复 待解决
#鸿蒙通关秘籍#在ArkTS中如何实现SharedArrayBuffer对象的跨线程共享?
54浏览 • 1回复 待解决
如何实现跨线程数据共享
249浏览 • 1回复 待解决
Native rdb写入是否有线程安全管理
1861浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何跨线程传递鸿蒙系统中的PixelMap对象?
54浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在TaskPool子线程中预加载So库并调用其函数?
76浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何利用ArkTS的TaskPool在鸿蒙应用中实现子线程模块加载?
58浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在TaskPool子线程中预加载.so库并通过句柄调用函数?
109浏览 • 1回复 待解决
ArkTs多线程方案如何保证线程安全
2559浏览 • 2回复 待解决
#鸿蒙通关秘籍#在鸿蒙中如何动态加载和调用Native库函数?
50浏览 • 1回复 待解决
如何在taskpool的线程调用类的成员函数
925浏览 • 1回复 待解决
#鸿蒙通关秘籍#在鸿蒙开发中实现子线程与主线程的同步调用的关键步骤?
48浏览 • 1回复 待解决
ArkTS有哪些线程安全的数据类型,多线程方案如何保证线程安全
2007浏览 • 1回复 待解决
要实现鸿蒙开发中的跨线程调用,利用
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);
}
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 回调,确保线程安全。