Warum läuft V8 nicht mit SDL-Threads?

9

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.ccZeile 716 : i::Isolate* isolate = env->GetIsolate();.

Hat jemand eine Ahnung, wie ich das beheben kann oder was das genaue Problem ist?

Christian Ivicevic
quelle
+1 für die Antwort. Sie sollten Ihre eigene Frage wirklich beantworten, damit Sie sie als beantwortet markieren können (das S / O-Team empfiehlt, Ihre eigenen Fragen zu beantworten, wenn Sie können).
Jonathan Dickinson
@ JonathanDickinson: Ich habe nicht genug Ruf und bin daher für 8 Stunden gesperrt, bis ich meine eigene Frage beantworten kann. Ich werde das morgen tun ;-)
Christian Ivicevic

Antworten:

6

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 werden HandleScopeund es sollte funktionieren, obwohl mein Code dort oben Mist ist. Ich habe alle Variablen usw. zu einer Methode ohne setupMethode oder die Variablen in kombiniert ScriptingEngine.

Lange Rede, kurzer Sinn: Das LockerObjekt ist für das Thread-Management verantwortlich, da sich die Engine für Sandbox-Zwecke isoliert.

Christian Ivicevic
quelle
Manchmal ist diese SO rep Sache für anständige Benutzer albern :).
Jonathan Dickinson