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.cc
lí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íneaHandleScope
y debería funcionar, aunque mi código allí es una mierda. He combinado todas las variables, etc. en un método sin unsetup
método o las variables enScriptingEngine
.Larga historia corta: el
Locker
objeto es responsable de la gestión de subprocesos ya que el motor se aísla para fines de sandboxing.fuente