Tại sao V8 không chạy với các chủ đề SDL?


9

tôi đã có thể biên dịch và liên kết V8 với trò chơi và diễn giải mã của tôi hoạt động tốt. Tuy nhiên, tôi muốn phân chia mã của mình và vòng lặp trò chơi nên tồn tại trong một luồng và công cụ kịch bản sẽ chạy trong luồng thứ hai cùng với vòng lặp trò chơi của tôi. Tôi đang sử dụng SDL và do đó đã thử mã này để tạo ra một luồng mới

SDL_CreateThread(ScriptingEngine::SpawnMain, NULL);

trong đó đoạn mã sau là công cụ kịch bản thử nghiệm của tôi:

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

Tuy nhiên, tôi gặp lỗi như Access violation reading location 0x00000000.trong api.ccdòng 716 : i::Isolate* isolate = env->GetIsolate();.

Có ai biết làm thế nào tôi có thể khắc phục điều này hoặc vấn đề chính xác là gì không?


+1 để quay lại với câu trả lời. Bạn thực sự nên trả lời câu hỏi của riêng bạn để bạn có thể đánh dấu câu trả lời (nhóm S / O khuyến khích trả lời câu hỏi của riêng bạn nếu bạn có thể).
Jonathan Dickinson

@JonathanDickinson: Tôi không đủ danh tiếng và do đó tôi bị chặn trong 8 giờ cho đến khi tôi có thể trả lời câu hỏi của chính mình. Tôi sẽ làm điều này vào ngày mai ;-)
Christian Ivicevic

Câu trả lời:


6

Giải pháp

Giải pháp là sử dụng màn hình như thế nào v8::Locker locker;. Chính xác thì dòng này phải được nhập vào dòng trước khi tạo HandleScopevà nó sẽ hoạt động, mặc dù mã của tôi ở đó là tào lao. Tôi đã kết hợp tất cả các biến, vv vào một phương thức mà không có setupphương thức hoặc các biến trong ScriptingEngine.

Câu chuyện dài: Lockerđối tượng chịu trách nhiệm quản lý luồng khi động cơ tự cô lập cho mục đích hộp cát.


Đôi khi điều này đại diện SO là ngớ ngẩn cho người dùng phong nha :).
Jonathan Dickinson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.