Perché V8 non funziona con thread SDL?


9

sono stato in grado di compilare e collegare V8 contro il mio gioco e l'interpretazione del codice funziona bene. Tuttavia, voglio dividere il mio codice e il ciclo di gioco dovrebbe esistere in un thread e il motore di scripting dovrebbe essere eseguito in un secondo thread insieme al mio loop di gioco. Sto usando SDL e quindi ho provato questo codice per generare un nuovo thread

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

dove il codice seguente è il mio motore di script di test:

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;
    }
}

Tuttavia ottengo un errore come Access violation reading location 0x00000000.in api.cclinea di 716: i::Isolate* isolate = env->GetIsolate();.

Qualcuno ha idea di come posso risolvere questo o qual è il problema esatto?


+1 per tornare con la risposta. Dovresti davvero rispondere alla tua domanda in modo da poterla contrassegnare come risposta (il team S / O incoraggia a rispondere alle tue domande se puoi).
Jonathan Dickinson,

@JonathanDickinson: non ho abbastanza reputazione e quindi sono bloccato per 8 ore finché non sono in grado di rispondere alla mia domanda. Lo farò domani ;-)
Christian Ivicevic,

Risposte:


6

Soluzione

La soluzione era usare un monitor simile v8::Locker locker;. Esattamente questa riga deve essere inserita nella riga prima della creazione di HandleScopee dovrebbe funzionare, anche se il mio codice lassù è merda. Ho combinato tutte le variabili ecc. In un metodo senza un setupmetodo o le variabili in ScriptingEngine.

Per farla breve: l' Lockeroggetto è responsabile della gestione dei thread poiché il motore si isola per scopi di sandbox.


A volte questa cosa SO rep è sciocca per gli utenti decenti :).
Jonathan Dickinson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.