Ich baue gerade eine App (Electron) und ich muss es mit einer C++ - Bibliothek verbinden. Ich habe den größten Teil der Bindung mit den NodeJS-C++ - Addons gemacht, aber mir fehlt ein wichtiger Teil, der mit dem Empfang der von der C++ - Bibliothek erzeugten Ereignisse in meinem Javascript-Code zusammenhängt.Ereignisse von nodejs addon zu Javascript senden
void Event1(int64_t id)
{
ArrayBufferAllocator allocator;
Isolate::CreateParams create_params;
create_params.array_buffer_allocator = &allocator;
Isolate* isolate = Isolate::New(create_params);
{
v8::Locker locker(isolate);
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
v8::Local<v8::Value> argv[1] = {
Nan::New("OnWillPlayTrack").ToLocalChecked(), // event name
};
Nan::MakeCallback(isolate->GetCurrentContext()->Global(),"emit", 1, argv);
}
isolate->Dispose();
}
Die Event1 wird durch die C++ lib genannt zu werden, die nichts mit V8 zu tun hat, und ich möchte jetzt ein Ereignis JavaScript abzufeuern, zurück zu Knoten (EventEmitter?). Ich denke, dass das größte Problem darin besteht, dass die meisten v8-Funktionen jetzt ein Isolate benötigen, und die meisten Beispiele im Web sind ziemlich alt.
Der Event1 Code stürzt bei MakeCallBack mit:
Thread 24 Crashed:: App
0 libnode.dylib 0x000000010a81e35b v8::String::NewFromOneByte(v8::Isolate*, unsigned char const*, v8::String::NewStringType, int) + 43
1 libnode.dylib 0x000000010a4b042f node::OneByteString(v8::Isolate*, char const*, int) + 15
2 libnode.dylib 0x000000010a4ba1b2 node::MakeCallback(node::Environment*, v8::Local<v8::Object>, char const*, int, v8::Local<v8::Value>*) + 50
3 libnode.dylib 0x000000010a4ba240 node::MakeCallback(v8::Isolate*, v8::Local<v8::Object>, char const*, int, v8::Local<v8::Value>*) + 96
4 addon.node 0x0000000110e62e1f Event1(long long) + 291 (v8.h:6721)
Jede Hilfe sehr geschätzt wird!
Dieses _could_ kann ein Duplikat von http://stackoverflow.com/questions/31207454/v8-multithreaded-function sein – ekarak
Dies ist kein Duplikat. Der Zugriff auf die Node.js 'EventEmitter' aus JavaScript innerhalb des C++ - Addon-Bereichs erfordert eine spezielle Prozedur, die ich in meiner Antwort unten erläutert habe. Multithreading innerhalb eines v8 C++ Addons ist ein völlig anderes Problem. – mkrufky