ArkTS注册后,C++启动的业务线程收到消息通知ArkTS层的一种思路

在C++层,用户创建一个线程,该线程的主要作用是作业务逻辑处理,在处理的过程中,需要将一些信息返回给界面呈现。

HarmonyOS
2024-05-23 21:40:41
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
躺平嗑产品懒猫

使用的核心API

napi_get_cb_info
napi_create_reference
uv_queue_work
napi_open_handle_scope
napi_get_reference_value
napi_call_function
napi_delete_reference
napi_close_handle_scope
pthread_create
pthread_detach

核心代码解释

Native层回调JS层函数,lambda表达式方式:

@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); 
            testNapi.regArkts((result: number)=>{ 
              hilog.info(0x0000, 'testTag', 'Test regArkts %{public}d', result); 
              this.message = 'result is ' + result.toString(); 
            }); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

C++层处理:

注册处理:

static napi_value RegArkts(napi_env env, napi_callback_info info) { 
    OH_LOG_INFO(LOG_APP, "thread id0  %{public}d.\n", pthread_self()); 
  
    size_t argc = 1; 
    napi_value argv[1] = {0}; 
napi_value thisVar = nullptr; 
void *data = nullptr; 
napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); 
 
napi_valuetype valueType = napi_undefined; 
napi_typeof(env, argv[0], &valueType); 
if (valueType != napi_function) { 
  return nullptr; 
} 
if (g_CallbackContext == nullptr) { 
  g_CallbackContext = new CallbackContext(); 
} 
g_CallbackContext->env = env; 
napi_create_reference(env, argv[0], 1, &g_CallbackContext->callbackRef); 
 
return thisVar; 
}

业务线程回调处理:

       } 
  
            delete context; 
        }); 
    return nullptr; 
} 
static void InitServiceThread() 
{ 
    pthread_t mythread; 
    if (pthread_create(&mythread, nullptr, CallbackTest, nullptr) != 0) { 
        return; 
    } 
}

index.d.ts

export const regArkts: (callback:(result:number)=>void) => number;

实现效果

初始界面:

执行后,界面显示:

日志打印信息:

适配的版本信息

·IDE:DevEco Studio 4.0.1.601

·SDK:HarmoneyOS 4.0.10.11

分享
微博
QQ
微信
回复
2024-05-24 17:00:36
相关问题
HarmonyOS 从C++触发通知ArkTS
474浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
802浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
1068浏览 • 1回复 待解决
HarmonyOS 求一种类似总线通知功能
695浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS对象
2818浏览 • 1回复 待解决
HarmonyOS ArkTSC/C++交互
1186浏览 • 1回复 待解决
如何实现ArkTSC/C++数组转换
1196浏览 • 1回复 待解决
ArkTSC++之间交互
1969浏览 • 1回复 待解决
C++调用ArkTS 定义方法
2672浏览 • 1回复 待解决