所以我在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
函数也知道它。我该怎么做?