я смог собрать и связать V8 с моей игрой, и интерпретация кода работает отлично. Однако я хочу разделить свой код, и игровой цикл должен существовать в одном потоке, а механизм сценариев должен работать во втором потоке рядом с моим игровым циклом. Я использую SDL и поэтому попытался этот код, чтобы создать новый поток
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
где следующий код - мой тестовый движок сценариев:
namespace ScriptingEngine {
v8::HandleScope handleScope;
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
v8::Persistent<v8::Context> context;
void Setup() {
// TODO: bind functions to global
// ...
context = v8::Context::New(NULL, global);
}
int SpawnMain(void *arguments) {
v8::Context::Scope scope(context);
v8::Handle<v8::Script> script = v8::Script::Compile(
v8::String::New("'Hello World'")
);
v8::Handle<v8::Value> result = script->Run();
context.Dispose();
return EXIT_SUCCESS;
}
}
Однако я получаю сообщение об ошибке , как Access violation reading location 0x00000000.
в api.cc
строке 716: i::Isolate* isolate = env->GetIsolate();
.
Кто-нибудь знает, как я могу это исправить или что именно проблема?
c++
javascript
sdl
multithreading
Кристиан Ивицевич
источник
источник
Ответы:
Решение
Решение было использовать монитор, как
v8::Locker locker;
. Именно эта строка должна быть введена в строку перед созданием,HandleScope
и она должна работать, хотя мой код там дерьмо. Я объединил все переменные и т. Д. В один метод безsetup
метода или переменных вScriptingEngine
.Короче говоря:
Locker
объект отвечает за управление потоками, так как движок изолируется для целей песочницы.источник