V8 एसडीएल थ्रेड्स के साथ क्यों नहीं चलता है?


9

मैं अपने खेल के खिलाफ V8 को संकलित और लिंक करने में सक्षम था और कोड व्याख्या ठीक काम करती है। हालाँकि मैं अपने कोड को विभाजित करना चाहता हूं और गेम लूप एक थ्रेड में मौजूद होना चाहिए और स्क्रिप्टिंग इंजन को मेरे गेम लूप के साथ दूसरे थ्रेड में चलाना चाहिए। मैं एसडीएल का उपयोग कर रहा हूं और इसलिए इस कोड को एक नया धागा बनाने की कोशिश की

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

हालाँकि मुझे लाइन 716 Access violation reading location 0x00000000.में एक त्रुटि मिलती है :।api.cci::Isolate* isolate = env->GetIsolate();

किसी को भी पता नहीं है कि मैं इसे कैसे ठीक कर सकता हूं या सटीक समस्या क्या है?


उत्तर के साथ वापस आने के लिए +1। आपको वास्तव में अपने स्वयं के प्रश्न का उत्तर देना चाहिए ताकि आप इसे उत्तर के रूप में चिह्नित कर सकें (यदि आप कर सकते हैं तो S / O टीम आपके स्वयं के प्रश्नों का उत्तर देने के लिए प्रोत्साहित करती है)।
जोनाथन डिकिंसन 19

@JonathanDickinson: मेरे पास पर्याप्त प्रतिष्ठा नहीं है और इसलिए मैं 8 घंटे तक अवरुद्ध हूं जब तक कि मैं अपने प्रश्न का उत्तर देने में सक्षम नहीं हूं। मैं कल इसे ;-)
क्रिश्चियन आइविसेविच

जवाबों:


6

समाधान

समाधान एक मॉनिटर की तरह उपयोग करना था v8::Locker locker;। वास्तव में इस लाइन को बनाने से पहले लाइन में प्रवेश किया HandleScopeजाना चाहिए और यह काम करना चाहिए, हालांकि मेरा कोड ऊपर बकवास है। मैंने सभी चर आदि को एक विधि के बिना एक setupविधि में या चर में जोड़ दिया है ScriptingEngine

लंबी कहानी छोटी: Lockerऑब्जेक्ट थ्रेड प्रबंधन के लिए जिम्मेदार है क्योंकि सैंडबॉक्सिंग उद्देश्यों के लिए इंजन खुद को अलग करता है।


कभी-कभी सभ्य उपयोगकर्ताओं के लिए यह एसओ प्रतिनिधि बात मूर्खतापूर्ण है :)।
जोनाथन डिकिन्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.