カメラからのデータを処理する 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
ます。どうすればいいですか?