เหตุใด 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บรรทัด i::Isolate* isolate = env->GetIsolate();716:

มีใครรู้บ้างไหมว่าฉันจะแก้ไขปัญหานี้ได้อย่างไรหรือปัญหาที่แน่นอนคืออะไร?


+1 เมื่อกลับมาพร้อมคำตอบ คุณควรตอบคำถามของคุณเองเพื่อให้คุณทำเครื่องหมายว่าตอบแล้ว (ทีม S / O สนับสนุนให้ตอบคำถามของคุณเองถ้าทำได้)
Jonathan Dickinson

@JonathanDickinson: ฉันมีชื่อเสียงไม่พอและดังนั้นฉันจึงถูกบล็อกเป็นเวลา 8 ชั่วโมงจนกระทั่งฉันสามารถตอบคำถามของตัวเองได้ ฉันจะทำสิ่งนี้ในวันพรุ่งนี้ ;-)
Christian Ivicevic

คำตอบ:


6

สารละลาย

v8::Locker locker;การแก้ปัญหาคือการใช้การตรวจสอบเช่น บรรทัดนี้ต้องถูกป้อนบรรทัดก่อนที่จะสร้างHandleScopeและควรทำงานแม้ว่ารหัสของฉันจะมีอึ ผมได้รวมตัวแปรทั้งหมด ฯลฯ เข้าสู่วิธีการหนึ่งโดยไม่ต้องมีวิธีการหรือตัวแปรในsetupScriptingEngine

เรื่องสั้นสั้น ๆ : Lockerวัตถุมีหน้าที่ในการจัดการเธรดเนื่องจากเครื่องยนต์แยกตัวเองเพื่อวัตถุประสงค์ในการทำแซนด์บ็อกซ์


บางครั้งสิ่งนี้ตัวแทนจึงโง่สำหรับผู้ใช้ที่ดี :)
Jonathan Dickinson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.