V8がSDLスレッドで実行されないのはなぜですか?


9

私は自分のゲームに対してV8をコンパイルしてリンクすることができ、コードの解釈はうまくいきました。ただし、コードを分割したいので、ゲームループは1つのスレッドに存在し、スクリプトエンジンはゲームループと一緒に2番目のスレッドで実行する必要があります。私は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メソッドや変数を使用せずに、すべての変数などを1つのメソッドにまとめましたScriptingEngine

要するにLocker、エンジンはサンドボックス化の目的でそれ自体を分離するため、オブジェクトはスレッド管理を担当します。


時々、このSO担当者はまともなユーザーにとってばかげています:)。
ジョナサンディキンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.