首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N-API C++插件导致电子图形用户界面被阻止

N-API C++插件导致电子图形用户界面被阻止
EN

Stack Overflow用户
提问于 2019-03-09 09:02:34
回答 1查看 697关注 0票数 0

我有一个N-API C++插件,我想使用一个电子图形用户界面。目前,C++插件有一个简单的函数,可以休眠10秒,然后执行8*2的计算,并将值返回给Javascript代码。Javascript代码每10秒运行一次C++插件。

代码语言:javascript
复制
// index.js
const addon = require('./build/Release/module');
const electron = require('electron');
const {app, BrowserWindow} = require('electron');
let win;

function createWindow() {
  win = new BrowserWindow({width: 800, height: 600});
  win.loadFile('./index.html');
  win.on('closed', () => {win = null});
}

app.on('ready', createWindow);

app.on('activate', () => {
  if (win === null) {
    createWindow();
  }
})


function getInfoFromNativeModule() {
  const value = 8;
  console.log(`${value} times 2 equals`, addon.my_function(value));
  setTimeout(getInfoFromNativeModule, 1000);
}

getInfoFromNativeModule();

然而,当我运行上面的代码时,我发现原生C++插件会导致Electron GUI在每次运行时阻塞10秒。有没有什么方法可以让我在后台执行繁重的计算,而使Electron GUI不阻塞或冻结?我假设我必须使用某种类型的线程,但我不确定如何使用N-API。下面是我的其余文件,包括module.cpp和package.json文件。

代码语言:javascript
复制
// module.cpp
napi_value MyFunction(napi_env env, napi_callback_info info) {
  napi_status status;
  size_t argc = 1;
  int number = 0;
  napi_value argv[1];
  status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL);

  if (status != napi_ok) {
    napi_throw_error(env, NULL, "Failed to parse arguments");
  }

  status = napi_get_value_int32(env, argv[0], &number);

  if (status != napi_ok) {
    napi_throw_error(env, NULL, "Invalid number was passed as argument");
  }
  napi_value myNumber;
  number = number * 2;
  std::cout << "sleeping for 10 seconds" << std::endl;
  sleep(10);
  std::cout << "waking up" << std::endl;
  status = napi_create_int32(env, number, &myNumber);

  if (status != napi_ok) {
    napi_throw_error(env, NULL, "Unable to create return value");
  }

  return myNumber;
}

napi_value Init(napi_env env, napi_value exports) {
  napi_status status;
  napi_value fn;

  status = napi_create_function(env, NULL, 0, MyFunction, NULL, &fn);
  if (status != napi_ok) {
    napi_throw_error(env, NULL, "Unable to wrap native function");
  }

  status = napi_set_named_property(env, exports, "my_function", fn);
  if (status != napi_ok) {
    napi_throw_error(env, NULL, "Unable to populate exports");
  }

  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)



// package.json
{
  "name": "n-api-article",
  "version": "0.1.0",
  "main": "index.js",
  "scripts": {
    "start": "node-gyp rebuild && electron .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/schahriar/n-api-article.git"
  },
  "engines": {
    "node": ">=8.4.0"
  },
  "dependencies": {
    "electron": "^4.0.8",
    "electron-rebuild": "^1.8.4"
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-12 19:40:36

它屏蔽电子产品的原因是sleep(10)。该调用在10秒内不会返回。

所以,是的,有一种方法可以将繁重的计算卸载到另一个线程。这样做的最大复杂之处在于,如果不采取额外的预防措施,线程将无法回调JavaScript,也无法访问JavaScript数据结构,因此必须为其提供所有必需的数据。

下面是C++抽象为N-API提供的使用线程计算Pi的示例。

node-addon-example

下面是创建线程安全回调的C++包装器。

napi-threadsafe-callback

这不是微不足道的,但这两个示例应该可以帮助您完成它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55072982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档