首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问“回调”函数中的V8上下文

无法访问“回调”函数中的V8上下文
EN

Stack Overflow用户
提问于 2015-01-20 12:09:02
回答 2查看 1.4K关注 0票数 1

我正在编写一个NodeJS插件,其中我使用了一个C库,它允许您在某些事件中注册回调。当回调被触发时,我想调用一个NodeJS回调函数。问题是,在我的C回调函数中,我在尝试执行任何与V8相关的操作时都会出现分段错误,比如创建一个HandleScope。

在test.js中:

代码语言:javascript
复制
...

myaddon.register(function(data) {
  console.log("data: " + JSON.stringify(data));
});

...

C.在试验中:

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <node.h>
#include <v8.h>

using namespace v8;

void WINAPI myEvent(int num, void * context) {
  HandleScope scope; // Segmentation fault here!

  Local<Function> * cb = (Local<Function>*)(context);

  Local<Object> obj = Object::New();
  obj->Set(String::NewSymbol("id"), Number::New(num));

  const int argc = 1;
  Local<Value> argv[argc] = { obj };
  (*cb)->Call(Context::GetCurrent()->Global(), argc, argv);

  sleep(1);
}

Handle<Value> RegisterEvent(const Arguments& args) {
    HandleScope scope;

    Local<Function> cb = Local<Function>::Cast(args[0]);

    int callbackId  = registerEvent((Event)&myEvent, &cb );
    printf("callback id: %i\n", callbackId);

    init();

    return scope.Close(Integer::New(callbackId));
}

void init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("register"),
      FunctionTemplate::New(RegisterEvent)->GetFunction());
}

NODE_MODULE(test, init)

编辑:用真实代码更新。

编辑:我刚刚更改了这个问题的标题,因为问题可能是我的回调函数无法访问V8上下文。因为我在创建HandleScope实例时遇到了一个分段错误,所以我看不到它还可能是什么。除了这个问题,我正试图在V8文档中找到答案,但它是巨大的,我没有太多的时间来测试和研究。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-23 18:13:54

您的处理程序函数myEvent()必须在V8线程中调用。如果没有,则必须将事件通知发布到V8线程中:

https://stackoverflow.com/a/15701160/1355844

https://stackoverflow.com/a/22946062/1355844

票数 1
EN

Stack Overflow用户

发布于 2015-01-20 13:16:37

您可能忘记为变量创建一个HandleScope。这应该对你有用。

代码语言:javascript
复制
void callbackFunc() {
  HandleScope scope;
  Local<Object> obj = Object::New();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28045047

复制
相关文章

相似问题

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