【关键字】 Node-API / 线程安全开发 / napi_call_threadsafe_function / 跨线程获取数据 【问题描述】 项目中需要对接...
napi_tsfn_nonblocking会立即返回一个错误,而napi_tsfn_blocking会等待直到队列中有空间为止。
1、调用线程安全函数时传promise std::promise<int> promise; auto future = promise.get_future(); napi_call_threadsafe_function(tsfn, &promise, napi_tsfn_blocking); int result = future.get(); 2、回调函数(call\_js\_cb)里面把结果赋值给promise reinterpret_cast<std::promise<int> *>(data)->...
示例代码如下: struct CallbackData { napi_threadsafe_function tsfn; napi_async_work work; }; // 异步线程中调用该接口向ArkTS线程投递指定优先级和入队方式的任务 static void ExecuteWork(napi_env env, void *data) { CallbackData *callbackData = reinterpret_cast<CallbackData *>(data); // 执行...
1. c++ 函数a中创建一个threadsafe_function 2. 函数a中会注册一个函数指针b到业务函数c 3. 在业务函数c另一个线程会执行函数指针b 4. 函数指针b中调用napi_call_threadsafe_function执行ts线程安全逻辑 报错日志如下: Reason:Signal:SIGSEGV(SEGV_MAPERR)@0x006b6bxxxx6b Fault thread info: Tid:22405, Name...
但传进CallJs函数的js_cb为0x0,怀疑是被GC了。 workaround方法是,在使用napi_get_cb_info得到js的callback函数地址value后封装成napi_ref,再通过context方式送入CallJs函数,再提取ref得到js函数的value。 问题是如何保证napi_create_threadsafe_function封装的CallJs得到的js_cb value是有效的? 是否将这个类型从val...
napi::ThreadSafeFunction 的工作原理如下: 创建线程安全函数:通过调用 napi_create_threadsafe_function 创建一个线程安全函数对象。这个对象包含一个 JavaScript 回调函数,该函数将在主线程上执行。 数据传递:在子线程中,通过调用 napi_call_threadsafe_function 将数据传递给主线程。这个函数调用是线程安全的,可以在多个...
napi_create_threadsafe_function:在多线程环境下进行一些数据交互,需要格外注意线程安全, napi_create_threadsafe_function 函数可以创建一个线程安全函数,然后在任意线程中调用 应用场景:当 native 侧有其他线程,并且需要根据这些线程的完成结果调用 JavaScript 函数时,这些线程必须与 native 侧的主线程进行通信,才能在主...
在主线程中,通过`napi_call_threadsafe_function`调用线程安全函数,并将`ThreadSafeInfo`结构体指针作为参数传递给它。线程安全函数会将数据传递给关联的回调函数`CallJs`,然后`CallJs`会将数据传递给JavaScript侧的回调函数。 通过使用`napi_call_threadsafe_function`,可以在不同的线程中安全地调用JavaScript侧的回调函...
napi_call_threadsafe_function(tsfn, args, 1, napi_tsfn_send); 这里向线程安全函数发送了一个带有一个参数的调用请求。 4. 处理线程安全函数的返回值。 当线程安全函数执行完成后,可以获取其返回值。通过在JavaScript函数中使用`return`语句返回值,然后在C或C++代码中通过`napi_value`类型的变量来接收。例如...