ভি 8 এসডিএল থ্রেড দিয়ে চালায় না কেন?


9

আমি আমার গেম এবং কোড ব্যাখ্যাটি ভাল কাজ করে এর বিপরীতে ভি 8 সংকলন করতে এবং লিঙ্ক করতে সক্ষম হয়েছি। তবে আমি আমার কোডটি ভাগ করতে চাই এবং গেম লুপটি একটি থ্রেডে থাকা উচিত এবং স্ক্রিপ্টিং ইঞ্জিনটি আমার গেম লুপের পাশাপাশি একটি দ্বিতীয় থ্রেডে চালানো উচিত। আমি এসডিএল ব্যবহার করছি এবং তাই এই কোডটি একটি নতুন থ্রেড ছড়িয়ে দেওয়ার চেষ্টা করেছি

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। আপনার সত্যিকারের নিজের প্রশ্নের উত্তর দেওয়া উচিত যাতে আপনি এটি উত্তর হিসাবে চিহ্নিত করতে পারেন (এস / ও দল আপনার নিজের প্রশ্নের উত্তর দিতে উত্সাহিত করতে পারে যদি আপনি পারেন)।
জনাথন ডিকিনসন

@ জোনাথন ডিকিনসন: আমার যথেষ্ট খ্যাতি নেই এবং তাই আমি আমার নিজের প্রশ্নের উত্তর দিতে সক্ষম না হওয়া পর্যন্ত আমাকে 8 ঘন্টা অবরুদ্ধ করা হয়েছে। আমি আগামীকাল এটি করব ;-)
খ্রিস্টান আইভিসেভিক

উত্তর:


6

সমাধান

সমাধানটি ছিল একটি মনিটরের মতো ব্যবহার করা v8::Locker locker;। সঠিকভাবে এই লাইনটি তৈরির আগে অবশ্যই লাইনে প্রবেশ করাতে HandleScopeহবে এবং এটি কাজ করা উচিত, যদিও আমার কোডটিতে আপত্তি আছে। আমি সমস্ত ভেরিয়েবল ইত্যাদিকে একটি setupপদ্ধতিতে বা ভেরিয়েবল ছাড়াই এক পদ্ধতিতে একত্রিত করেছি ScriptingEngine

দীর্ঘ গল্প সংক্ষিপ্ত: বিষয়টি Lockerথ্রেড পরিচালনার জন্য দায়ী কারণ ইঞ্জিনটি স্যান্ডবক্সিংয়ের জন্য নিজেকে বিচ্ছিন্ন করে।


কখনও কখনও এই এই পুনরাবৃত্তি জিনিস ভদ্র ব্যবহারকারীদের জন্য নির্বোধ :)।
জনাথন ডিকিনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.