从node.js中的C ++模块重复调用javascript回调

时间:2015-11-25 17:41:32

标签: c++ node.js node-modules node.js-addon

所以我在C ++中编写一个node.js模块来处理来自摄像头的数据。我想在新数据可用时在我的app.js文件中调用回调函数。

目前我所拥有的

现在我在我的节点javascript文件(app.js)中有以下代码。它每秒都在我的C ++ - Module中调用一个函数,并返回到目前为止已处理的帧数:

setInterval(function () {
        var counter = MyCPPModule.NumberOfFrames();
        console.log(counter);
    }, 1000);

在我的C ++文件中,我有以下功能。

1。)我有一个函数来获取帧数 - 从上面的javascript调用的函数 - 其中frameCounter指的是全局变量。

void NumberOfFrames(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);
    Local<Integer> retval = v8::Integer::New(isolate, frameCounter);
    args.GetReturnValue().Set(retval);
}

2。)我在C ++模块中有一个C ++ - 回调函数,只要有新框架就会被触发(为了清楚起见,这个回调独立于node.js并具有与node.js-callbacks没什么关系。

void NewFrameAvailable(char** imageBuffer, /* more arguments */)
{
// ... 
     frameCounter++;  // increment global variable
// ...
}

所有这一切都很好。

我想要完成的事情

而不是在我的javascript代码中使用setInterval注册函数。我想以某种方式在我的C ++模块中注册一个函数,只要相机可以获得新帧,就会重复调用该函数。它应该像setInterval一样,但不是每秒触发,而是在帧可用时触发。

我希望在javascript端的代码类似于:

MyCPPModule.setMyFrameInterval(function (msg) {
        console.log(msg);
    });

在C ++模块中我想做类似的事情:

void NewFrameAvailable(char** imageBuffer, /* more arguments */)
{ 
    // ... 
    frameCounter++;  // increment global variable
    Local<Function> cb = /* WHAT DO I DO HERE*/ ;
    Isolate*isolate = /* WHAT DO I DO HERE */;
    const unsigned argc = 1;
    Local<Value> argv[argc] = { String::NewFromUtf8(isolate, std::to_string(frameCounter)) };
    cb->Call(Null(isolate), argc, argv);
    // ...
}

和一个用setMyFrameInterval注册javascipt-callback的函数:

void setMyFrameInterval(const FunctionCallbackInfo<Value>& args) {
    Local<Function> cb = Local<Function>::Cast(args[0]); // make this somehow global? 
    Isolate*isolate = args.GetIsolate()
    //...
} 

那么,如何从NewFrameAvailable调用javascript回调(C ++回调函数在帧可用时触发)。我想我基本上必须在setMyFrameInterval函数中以某种方式全局提供javascript函数,以便newFrameAvailable函数也知道它。我该怎么做?

0 个答案:

没有答案