Ich konnte V8 kompilieren und mit meinem Spiel verknüpfen und die Code-Interpretation funktioniert einwandfrei. Ich möchte jedoch meinen Code teilen und die Spielschleife sollte in einem Thread vorhanden sein und die Skript-Engine sollte in einem zweiten Thread neben meiner Spielschleife ausgeführt werden. Ich verwende SDL und habe daher versucht, mit diesem Code einen neuen Thread zu erstellen
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
Dabei ist der folgende Code meine Testskript-Engine:
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;
}
}
Ich erhalte jedoch einen Fehler wie Access violation reading location 0x00000000.
in api.cc
Zeile 716 : i::Isolate* isolate = env->GetIsolate();
.
Hat jemand eine Ahnung, wie ich das beheben kann oder was das genaue Problem ist?
c++
javascript
sdl
multithreading
Christian Ivicevic
quelle
quelle
Antworten:
Lösung
Die Lösung bestand darin, einen Monitor wie zu verwenden
v8::Locker locker;
. Genau diese Zeile muss in die Zeile vor der Erstellung der eingegeben werdenHandleScope
und es sollte funktionieren, obwohl mein Code dort oben Mist ist. Ich habe alle Variablen usw. zu einer Methode ohnesetup
Methode oder die Variablen in kombiniertScriptingEngine
.Lange Rede, kurzer Sinn: Das
Locker
Objekt ist für das Thread-Management verantwortlich, da sich die Engine für Sandbox-Zwecke isoliert.quelle