Чому V8 не працює з потоками SDL?


9

Мені вдалося скласти і зв’язати V8 проти моєї гри та інтерпретації коду. Однак я хочу розділити свій код, і цикл ігор повинен існувати в одному потоці, а двигун сценаріїв повинен працювати в другому потоці поряд зі своїм ігровим циклом. Я використовую SDL і тому спробував цей код, щоб породити нову нитку

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

де наступний код є моїм тестовим сценарієм:

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;
    }
}

Однак я отримую повідомлення про помилку , як Access violation reading location 0x00000000.в api.ccрядку 716: i::Isolate* isolate = env->GetIsolate();.

Хтось має поняття, як я можу це виправити чи в чому полягає точна проблема?


+1 за повернення з відповіддю. Ви дійсно повинні відповісти на власне запитання, щоб ви могли позначити його як відповідь (команда S / O рекомендує відповісти на власні запитання, якщо можете).
Джонатан Дікінсон

@JonathanDickinson: У мене недостатньо репутації, і тому мене блокують 8 годин, поки я не зможу відповісти на власне запитання. Я зроблю це завтра ;-)
Крістіан Івічевич

Відповіді:


6

Рішення

Рішенням було використання монітора на зразок v8::Locker locker;. Саме цей рядок повинен бути введений рядок перед створенням HandleScopeі він повинен працювати, хоча мій код там є лайно. Я об'єднав всі змінні тощо в один метод без setupметоду або змінних в ScriptingEngine.

Довга коротка історія: the Locker об’єкт відповідає за управління потоками, оскільки двигун ізолює себе для пісочницьких цілей.


Іноді ця річ з тим, що репрезентує, є гідною для гідних користувачів :).
Джонатан Дікінсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.