From 2ec76ea9e280a91854bdebd987716d12675063c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E4=B8=9C=E6=B5=B7?= Date: Thu, 15 May 2025 10:09:41 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/napi_init.cpp | 21 ++++++++++++++++++++- entry/src/main/ets/pages/Index.ets | 4 ++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/entry/src/main/cpp/napi_init.cpp b/entry/src/main/cpp/napi_init.cpp index 516f274..6ab1473 100644 --- a/entry/src/main/cpp/napi_init.cpp +++ b/entry/src/main/cpp/napi_init.cpp @@ -21,6 +21,7 @@ #define LOG_DOMAIN 0x3200 #define LOG_TAG "MY_TAG" +// [Start callback_context] napi_threadsafe_function tsFn; static int g_value = 0; @@ -28,7 +29,9 @@ struct CallbackContext { napi_env env = nullptr; napi_ref callbackRef = nullptr; }; +// [End callback_context] +// [Start sub_thread] void SubThread(CallbackContext *asyncContext) { if (asyncContext == nullptr) { return; @@ -38,7 +41,9 @@ void SubThread(CallbackContext *asyncContext) { napi_call_threadsafe_function(tsFn, asyncContext, napi_tsfn_nonblocking); napi_release_threadsafe_function(tsFn, napi_tsfn_release); } +// [End sub_thread] +// [Start thread_safe_call_js] static void ThreadSafeCallJs(napi_env env, napi_value js_callBack, void *context, void *data) { CallbackContext *argContext = reinterpret_cast(data); if (argContext != nullptr) { @@ -66,7 +71,9 @@ static void ThreadSafeCallJs(napi_env env, napi_value js_callBack, void *context delete argContext; argContext = nullptr; } +// [End thread_safe_call_js] +// [Start thread_safe_case] static napi_value ThreadSafeCase(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value js_callback; @@ -92,11 +99,14 @@ static napi_value ThreadSafeCase(napi_env env, napi_callback_info info) { t.detach(); return nullptr; } +// [End thread_safe_case] - +// [Start uv_loop_async] uv_loop_t *loop = nullptr; uv_async_t *async = nullptr; +// [End uv_loop_async_t] +// [Start async_handler] void async_handler(uv_async_t *handle) { CallbackContext *context = reinterpret_cast(handle->data); napi_handle_scope scope = nullptr; @@ -125,7 +135,9 @@ void async_handler(uv_async_t *handle) { context = nullptr; uv_close((uv_handle_t *)async, [](uv_handle_t *handle) { delete (uv_async_t *)handle; }); } +// [End async_handler] +// [Start callback_uv_work_test] void CallbackUvWorkTest(CallbackContext *context) { if (context == nullptr) { return; @@ -135,8 +147,10 @@ void CallbackUvWorkTest(CallbackContext *context) { async->data = reinterpret_cast(context); uv_async_send(async); } +// [End callback_uv_work_test] static napi_value LibUvCase(napi_env env, napi_callback_info info) { + // [Start lib_uv_case] size_t argc = 1; napi_value callback_function; napi_get_cb_info(env, info, &argc, &callback_function, nullptr, nullptr); @@ -147,20 +161,25 @@ static napi_value LibUvCase(napi_env env, napi_callback_info info) { return nullptr; } + // [Start uv_default_loop] loop = uv_default_loop(); async = new uv_async_t; uv_async_init(loop, async, async_handler); + // [StartExclude uv_default_loop] auto asyncContext = new CallbackContext(); if (asyncContext == nullptr) { return nullptr; } asyncContext->env = env; napi_create_reference(env, callback_function, 1, &asyncContext->callbackRef); + // [End lib_uv_case] + // [EndExclude uv_default_loop] std::thread caseThread(CallbackUvWorkTest, asyncContext); caseThread.detach(); uv_run(loop, UV_RUN_DEFAULT); return nullptr; + // [End uv_default_loop] } EXTERN_C_START diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index d21cad0..c490469 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -18,6 +18,7 @@ import { promptAction } from '@kit.ArkUI' @Entry @Component struct Index { + // [Start work_function] @State value: number = 0; @State message: ResourceStr = $r('app.string.result_description'); work: Function = (param: number) => { @@ -25,6 +26,7 @@ struct Index { this.value = param; return param; } + // [End work_function] build() { Row() { @@ -60,7 +62,9 @@ struct Index { Button($r('app.string.threadSafe_Case')) .width('100%') .onClick(() => { + // [Start testNapi_thread_safe_case] testNapi.threadSafeCase(this.work); + // [End testNapi_thread_safe_case] promptAction.showToast({ message: $r('app.string.threadSafe_message'), duration: 2000 -- Gitee From 2adf4de782fd57806da1b6ee961b125a5fa1a63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E4=B8=9C=E6=B5=B7?= Date: Thu, 15 May 2025 14:47:46 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/napi_init.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/entry/src/main/cpp/napi_init.cpp b/entry/src/main/cpp/napi_init.cpp index 6ab1473..d28a98f 100644 --- a/entry/src/main/cpp/napi_init.cpp +++ b/entry/src/main/cpp/napi_init.cpp @@ -165,8 +165,8 @@ static napi_value LibUvCase(napi_env env, napi_callback_info info) { loop = uv_default_loop(); async = new uv_async_t; uv_async_init(loop, async, async_handler); - - // [StartExclude uv_default_loop] + // [End uv_default_loop] + auto asyncContext = new CallbackContext(); if (asyncContext == nullptr) { return nullptr; @@ -174,7 +174,7 @@ static napi_value LibUvCase(napi_env env, napi_callback_info info) { asyncContext->env = env; napi_create_reference(env, callback_function, 1, &asyncContext->callbackRef); // [End lib_uv_case] - // [EndExclude uv_default_loop] + // [Start uv_default_loop] std::thread caseThread(CallbackUvWorkTest, asyncContext); caseThread.detach(); uv_run(loop, UV_RUN_DEFAULT); -- Gitee From 85e4efc7f0625a2af688d60d286de5d96b58c28b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E4=B8=9C=E6=B5=B7?= Date: Fri, 16 May 2025 10:59:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/napi_init.cpp | 2 ++ entry/src/main/ets/pages/Index.ets | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/entry/src/main/cpp/napi_init.cpp b/entry/src/main/cpp/napi_init.cpp index d28a98f..b650e1d 100644 --- a/entry/src/main/cpp/napi_init.cpp +++ b/entry/src/main/cpp/napi_init.cpp @@ -160,6 +160,7 @@ static napi_value LibUvCase(napi_env env, napi_callback_info info) { if (valueType != napi_valuetype::napi_function) { return nullptr; } + // [End lib_uv_case] // [Start uv_default_loop] loop = uv_default_loop(); @@ -167,6 +168,7 @@ static napi_value LibUvCase(napi_env env, napi_callback_info info) { uv_async_init(loop, async, async_handler); // [End uv_default_loop] + // [Start lib_uv_case] auto asyncContext = new CallbackContext(); if (asyncContext == nullptr) { return nullptr; diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index c490469..ed58dd6 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -18,9 +18,9 @@ import { promptAction } from '@kit.ArkUI' @Entry @Component struct Index { + @State message: ResourceStr = $r('app.string.result_description'); // [Start work_function] @State value: number = 0; - @State message: ResourceStr = $r('app.string.result_description'); work: Function = (param: number) => { param += 30; this.value = param; -- Gitee