1

カメラからのデータを処理する node.js モジュールを C++ で作成しています。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++ コールバック関数があります (明確にするために、このコールバックは node.js から独立しており、node.js コールバックとは直接関係ありません)。 )。

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