pude compilar y vincular V8 contra mi juego y la interpretación del código funciona bien. Sin embargo, quiero dividir mi código y el bucle del juego debería existir en un hilo y el motor de secuencias de comandos debería ejecutarse en un segundo hilo junto a mi bucle del juego. Estoy usando SDL y, por lo tanto, probé este código para generar un nuevo hilo
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
donde el siguiente código es mi motor de secuencias de comandos de prueba:
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;
}
}
Sin embargo, me sale un error al igual que Access violation reading location 0x00000000.en la api.cclínea 716: i::Isolate* isolate = env->GetIsolate();.
¿Alguien tiene idea de cómo puedo solucionar esto o cuál es el problema exacto?
c++
javascript
sdl
multithreading
Christian Ivicevic
fuente
fuente

Respuestas:
Solución
La solución fue utilizar un monitor como
v8::Locker locker;. Exactamente esta línea debe ingresarse antes de la creación de la líneaHandleScopey debería funcionar, aunque mi código allí es una mierda. He combinado todas las variables, etc. en un método sin unsetupmétodo o las variables enScriptingEngine.Larga historia corta: el
Lockerobjeto es responsable de la gestión de subprocesos ya que el motor se aísla para fines de sandboxing.fuente