为什么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个小时,直到我能够回答自己的问题为止。我明天会做;-)
Christian Ivicevic,2012年

Answers:


6

解决的办法是使用监视器v8::Locker locker;。确实必须在创建之前在该行中输入该行,并且该行应该可以HandleScope工作,尽管我的代码很烂。我已经将所有变量等组合成一个没有setup方法或方法中的变量ScriptingEngine

长话短说:该Locker对象负责线程管理,因为引擎出于沙盒处理的目的将自身隔离。


有时候,这样的SO代表对于体面的用户来说是愚蠢的:)。
乔纳森·迪金森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.