Моя настройка среды JS (на основе https://nodejs.org/docs/latest-v22.x/api/embedding.html) выполняется в отдельном потоке, как и моя логика также выполняется в отдельном потоке.
Я могу запустить NodeJS приложение просто отлично и даже вызывает методы C++ из JS. Пока все хорошо.
Но мой код аварийно завершает работу, как только я пытаюсь вызвать функцию обратного вызова JS со стороны C++.
Я уже понял, что не могу получить доступ к структурам V8 из другого потока. Поэтому я реализовал очередь, которая гарантирует выполнение моего кода в потоке JS.
Вызовите «uv_async_init», чтобы зарегистрировать дескриптор «uv_aync_t». Когда я добавляю элемент очереди, я вызываю «uv_async_send», и вызывается моя функция обратного вызова.
(Добавление и извлечение очереди, конечно, защищено мьютексом)
В функции обратного вызова (ProcessMyQueue в стеке вызовов ниже) затем вызывается «MyEmitFunc», которая в основном делает следующее:
Код: Выделить всё
void MyEmitFunc(const std::string & someStringFromQueue) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::Isolate::Scope isolateScope(isolate);
v8::Local s = v8::String::NewFromUtf8(isolate, someStringFromQueue.c_str()).ToLocalChecked(); //
Подробнее здесь: [url]https://stackoverflow.com/questions/79813141/how-to-call-js-code-from-c-thread-in-embedded-nodejs-v8-environment[/url]
Мобильная версия