udało mi się skompilować i połączyć V8 z moją grą, a interpretacja kodu działa dobrze. Jednak chcę podzielić mój kod, a pętla gry powinna istnieć w jednym wątku, a silnik skryptowy powinien działać w drugim wątku obok mojej pętli gry. Korzystam z SDL i dlatego wypróbowałem ten kod, aby spawnować nowy wątek
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
gdzie następujący kod to mój testowy silnik skryptowy:
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;
}
}
Jednakże pojawia się błąd jak Access violation reading location 0x00000000.
w api.cc
wierszu 716: i::Isolate* isolate = env->GetIsolate();
.
Czy ktoś ma pojęcie, jak to naprawić lub jaki jest dokładny problem?
c++
javascript
sdl
multithreading
Christian Ivicevic
źródło
źródło
Odpowiedzi:
Rozwiązanie
Rozwiązaniem było użycie podobnego monitora
v8::Locker locker;
. Dokładnie ta linia musi zostać wprowadzona do linii przed utworzeniemHandleScope
i powinna działać, chociaż mój kod tam jest badziewiem. Połączyłem wszystkie zmienne itp. W jedną metodę bezsetup
metody lub zmiennych wScriptingEngine
.Krótko mówiąc:
Locker
obiekt jest odpowiedzialny za zarządzanie wątkami, ponieważ silnik izoluje się do celów piaskownicy.źródło