Consegui compilar e vincular o V8 ao meu jogo e a interpretação de código funciona bem. No entanto, quero dividir meu código e o loop do jogo deve existir em um thread e o mecanismo de script deve ser executado em um segundo thread ao lado do loop do jogo. Estou usando SDL e, portanto, tentei esse código para gerar um novo thread
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
onde o código a seguir é meu mecanismo de script de teste:
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;
}
}
No entanto eu recebo um erro como Access violation reading location 0x00000000.
na api.cc
linha 716: i::Isolate* isolate = env->GetIsolate();
.
Alguém tem uma idéia de como posso corrigir isso ou qual é o problema exato?
c++
javascript
sdl
multithreading
Christian Ivicevic
fonte
fonte
Respostas:
Solução
A solução foi usar um monitor como
v8::Locker locker;
. Exatamente essa linha deve ser inserida na linha antes da criação doHandleScope
e deve funcionar, embora meu código lá em cima seja uma porcaria. Eu combinei todas as variáveis etc. em um método sem umsetup
método ou as variáveisScriptingEngine
.Para encurtar a história: o
Locker
objeto é responsável pelo gerenciamento do encadeamento, pois o mecanismo se isola para fins de sandbox.fonte