saya bisa mengkompilasi dan menautkan V8 dengan permainan saya dan interpretasi kode berfungsi dengan baik. Namun saya ingin membagi kode saya dan loop game harus ada di satu utas dan mesin scripting harus berjalan di utas kedua di samping loop permainan saya. Saya menggunakan SDL dan karenanya mencoba kode ini untuk menelurkan utas baru
SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);
di mana kode berikut adalah mesin skrip pengujian saya:
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;
}
}
Namun saya mendapatkan error seperti Access violation reading location 0x00000000.
di api.cc
baris 716: i::Isolate* isolate = env->GetIsolate();
.
Adakah yang tahu bagaimana saya bisa memperbaiki ini atau apa masalah sebenarnya?
c++
javascript
sdl
multithreading
Christian Ivicevic
sumber
sumber
Jawaban:
Larutan
Solusinya adalah menggunakan monitor seperti
v8::Locker locker;
. Tepatnya baris ini harus dimasukkan baris sebelum pembuatanHandleScope
dan itu harus berfungsi, meskipun kode saya di sana adalah omong kosong. Saya telah menggabungkan semua variabel dll menjadi satu metode tanpasetup
metode atau variabel dalamScriptingEngine
.Singkat cerita:
Locker
objek bertanggung jawab atas manajemen utas karena mesin mengisolasi dirinya untuk keperluan sandboxing.sumber