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

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

HarmonyOS
2024-05-23 21:40:41
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
p3586

使用的核心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
相关问题
如何在C/C++ 创建ArkTS对象
713浏览 • 1回复 待解决
C++调用ArkTS 定义方法
478浏览 • 1回复 待解决
ArkTSC++之间交互
388浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换?
361浏览 • 0回复 待解决
ArkTS对象绑定C++对象如何回收?
350浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
474浏览 • 1回复 待解决
ArkTSC++互相直接调用
453浏览 • 1回复 待解决
C++ 如何获取操作 Arkts 实例
388浏览 • 1回复 待解决
C++同步调ArkTS里面的方法
367浏览 • 1回复 待解决
ts给c++传递数组,c++如何解析
467浏览 • 1回复 待解决
使用Promise实现一种串行调用方式
355浏览 • 1回复 待解决