在C++回调时,如何阻塞TS主线程?-鸿蒙开发者社区-51CTO.COM

在C++回调时,如何阻塞TS主线程?

有一个回调是在C++ 主线程返回的,这个回调需要一个返回值,这个返回值需要通过网络请求获取,网络请求是异步的方法,使用会导致C++回调方法没办法拿到这个返回值。

C++:

func1(){ 
  CallFunction(“getxx”,{arg}); 
}

TS:

getxx{ 
  let result = 网络请求(异步方法); 
  return result; 
}

因为网络请求是异步执行,没办法给C++回调添加async,会导致return的result没有值。

HarmonyOS
2024-08-28 18:06:04
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

建议在c++ 通过napi_create_threadsafe_function创建安全线程函数,通过napi_create_async_work创建异步函数,napi_call_function调用异步方法可参考:

static void CallJs(napi_env env, napi_value jsCb, void *context, void *data) { 
  if (env == nullptr) { 
    return; 
  } 
  napi_value undefined = nullptr; 
  napi_value promise = nullptr; 
  char str[] = "wlan0"; 
 
  napi_value sysModule; 
  napi_load_module(env, "@ohos.net.statistics", &sysModule); 
 
  napi_value param; 
  napi_create_string_utf8(env, str, NAPI_AUTO_LENGTH, ¶m); 
  napi_call_function(env, sysModule, jsCb, 1, ¶m, &promise); 
  napi_value thenFunc = nullptr; 
  if (napi_get_named_property(env, promise, "then", &thenFunc) != napi_ok) { 
    return; 
  } 
  napi_value resolvedCallback; 
  napi_value rejectedCallback; 
  napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH, ResolvedCallback, data, &resolvedCallback); 
  napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH, RejectedCallback, data, &rejectedCallback); 
  napi_value argv[2] = {resolvedCallback, rejectedCallback}; 
  napi_call_function(env, promise, thenFunc, 2, argv, nullptr); 
} 
// 执行异步任务 
static void ExecuteWork(napi_env env, void *data) { 
  CallbackData *callbackData = reinterpret_cast<CallbackData *>(data); 
  std::promise<double> promise; 
  auto future = promise.get_future(); 
  // 调用线程安全函数 
  napi_call_threadsafe_function(callbackData->tsfn, &promise, napi_tsfn_nonblocking); 
  try { 
    auto result = future.get(); 
    OH_LOG_INFO(LOG_APP, "getIfaceRxBytes Result from JS %{public}f", result); 
  } catch (const std::exception &e) { 
    // OH_LOG_INFO(LOG_APP, "XXX, Result from JS %{public}s", e.what()); 
  } 
} 
// 异步任务完成回调 
static void WorkComplete(napi_env env, napi_status status, void *data) { 
  CallbackData *callbackData = reinterpret_cast<CallbackData *>(data); 
  napi_release_threadsafe_function(callbackData->tsfn, napi_tsfn_release); 
  napi_delete_async_work(env, callbackData->work); 
  callbackData->tsfn = nullptr; 
  callbackData->work = nullptr; 
} 
static napi_value CallAsyncFunc(napi_env env, napi_callback_info info) { 
  size_t argc = 1; 
  napi_value jsCb = nullptr; 
  CallbackData *callbackData = nullptr; 
  napi_get_cb_info(env, info, &argc, &jsCb, nullptr, reinterpret_cast<void **>(&callbackData)); 
 
 
  napi_value sysModule; 
  napi_load_module(env, "@ohos.net.statistics", &sysModule); 
 
  napi_value getIfaceRxBytesFunc ; 
  napi_get_named_property(env, sysModule, "getIfaceRxBytes", &getIfaceRxBytesFunc); 
 
  // 创建一个线程安全函数 
  napi_value resourceName = nullptr; 
  napi_create_string_utf8(env, "CallAsyncFunc", NAPI_AUTO_LENGTH, &resourceName); 
  napi_create_threadsafe_function(env, getIfaceRxBytesFunc, nullptr, resourceName, 0, 1, callbackData, nullptr, callbackData, CallJs, 
    &callbackData->tsfn); 
 
  // 创建一个异步任务 
  napi_create_async_work(env, nullptr, resourceName, ExecuteWork, WorkComplete, callbackData, &callbackData->work); 
 
  // 将异步任务加入到异步队列中 
  napi_queue_async_work(env, callbackData->work); 
  return nullptr; 
}
分享
微博
QQ
微信
回复
2024-08-28 22:42:18
相关问题
如何C++ 提供函数?
2354浏览 • 1回复 待解决
tsc++传递数组,c++如何解析
1748浏览 • 1回复 待解决
zip包的解压是主线程还是IO线程
1568浏览 • 1回复 待解决
如何修改C++版本?C++支持情况?
933浏览 • 1回复 待解决
NAPI执行上层如何获取env
2157浏览 • 1回复 待解决
如何判断当前线程是否是主线程
2308浏览 • 1回复 待解决