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

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

C++:

func1(){ 
  CallFunction(“getxx”,{arg}); 
}
  • 1.
  • 2.
  • 3.

TS:

getxx{ 
  let result = 网络请求(异步方法); 
  return result; 
}
  • 1.
  • 2.
  • 3.
  • 4.

因为网络请求是异步执行,没办法给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; 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
分享
微博
QQ
微信
回复
2024-08-28 22:42:18
相关问题
如何C++ 提供函数?
3518浏览 • 1回复 待解决
tsc++传递数组,c++如何解析
2746浏览 • 1回复 待解决