j'ai pu compiler et lier la V8 à mon jeu et l'interprétation du code fonctionne bien. Cependant, je veux diviser mon code et la boucle de jeu devrait exister dans un thread et le moteur de script devrait fonctionner dans un deuxième thread à côté de ma boucle de jeu. J'utilise SDL et j'ai donc essayé ce code pour générer un nouveau thread
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
où le code suivant est mon moteur de script de 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;
}
}
Cependant , je reçois une erreur comme Access violation reading location 0x00000000.
dans la api.cc
ligne 716: i::Isolate* isolate = env->GetIsolate();
.
Quelqu'un at-il une idée de la façon dont je peux résoudre ce problème ou quel est le problème exact?
c++
javascript
sdl
multithreading
Christian Ivicevic
la source
la source
Réponses:
Solution
La solution était d'utiliser un moniteur comme
v8::Locker locker;
. Exactement, cette ligne doit être entrée dans la ligne avant la création de laHandleScope
et cela devrait fonctionner, bien que mon code là-haut soit de la merde. J'ai combiné toutes les variables, etc. en une seule méthode, sanssetup
méthode ni variablesScriptingEngine
.Pour faire court: l'
Locker
objet est responsable de la gestion des threads car le moteur s'isole à des fins de sandboxing.la source