1

所以我正在用 C++ 编写一个 node.js 模块,它处理来自相机的数据。app.js每当有新数据可用时,我想在我的文件中调用一个回调函数。

我现在拥有的

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

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++-callback 函数,只要有新的帧可用就会触发(为了清楚起见,这个回调独立于 node.js 并且与 node.js-callbacks 没有直接关系)。

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

所有这一切都很好。

我想完成什么

setInterval而不是在我的 javascript 代码中注册一个函数。我想以某种方式在我的 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);
    // ...
}

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

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

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

4

0 回答 0