如何存储对函数的引用,以便稍后可以在节点.js C++插件模块中回调它
How do I store a reference to a function so I can call it back later in a node.js C++ addon module?
这是我用C++编写并使用node-gyp构建的node.js插件模块。当存储函数时,我正在尝试存储指向该函数的指针,以便以后可以使用它
当我稍后尝试调用它时,尽管在调用函数中出现分段错误。如果我检查两个函数中的指针(使用 cout),让我感到困惑的是它们是相同的值。
所以我猜测调用两个函数之间调用上下文的变化变化,或者我不明白我指的是什么。
所有(嗯)指针都非常感谢我在这里的问题......
#include <node.h> #include <v8.h> using namespace v8; v8::Persistent<v8::Function> callbackFunction; Handle<Value> StoreFunction(const Arguments& args) { HandleScope scope; callbackFunction = *Local<Function>::Cast(args[0]); return scope.Close(Undefined()); } Handle<Value> InvokeFunction(const Arguments& args) { HandleScope scope; Local<Value> argv[1] = { String::New("Callback from InvokeFunction")}; callbackFunction->Call(Context::GetCurrent()->Global(), 1, argv); return scope.Close(Undefined()); } void init(Handle<Object> target) { NODE_SET_METHOD(target, "StoreFunction", StoreFunction); NODE_SET_METHOD(target, "InvokeFunction", InvokeFunction); } NODE_MODULE(someaddonmodule, init);
当然还有一些叫js...
var myaddon = require('../build/Release/someaddonmodule');
myaddon.StoreFunction(function(data){
console.log("Called back: "+data);
});
myaddon.InvokeFunction(); //causes a segmentation fault
答案是因为我们不再用Java编程了。我创建的指针指向本地句柄,而不是函数。持有对此的"引用"不足以阻止 V8 垃圾收集在范围关闭时销毁它。
为了解决这个问题,需要向 V8 发出一个显式请求,以留出一些内存来保存像这样完成的功能:
Persistent< Function > percy;
Local<Function> callbackFunction = Local<Function>::Cast(args[0]);
percy = Persistent<Function>::New(callbackFunction);
如果任何对 V8 内部结构有更好了解的人知道的比这更多,我仍然非常想听听你的解释:)
相关文章:
- 如何在C++中使用带有SFML的http reqest从节点.js服务器获取数据?
- 节点.js HTTP 无法通过套接字接收来自C++客户端的请求
- 将二进制字符串/文件内容从 c++ 传递到节点 js
- 从C++回调函数发出节点.js事件
- 节点.js到 c++ 客户端:不接收来自 socket.emit 的消息
- 如何在 rust 中静态链接节点.js?
- 将节点 js 代码集成到 cpp 库时出错
- 为什么在节点JS中需要libuv
- 节点.js C++插件 - 设置数组的某个索引
- 插件中节点.js/Nan 回调C++不频繁的隔离错误
- Linux复制文件连接到节点JS / Python / C / C 之后
- 节点 js 我可以从用 C++ 编写的 windows 命令行应用程序中获取退出代码
- 将 Opencv Mat 返回到节点.js v8
- 加密++和节点.js组合
- 如何将C++应用程序与节点.js服务器连接以获取 JSON 数据
- 节点.js插件计时器上下文
- 将文本文件创建到节点.js的插件C++
- 节点.js C++ 插件:返回新副本
- 如何存储对函数的引用,以便稍后可以在节点.js C++插件模块中回调它
- 你如何在Windows中构建节点.js