簡體   English   中英

V8與繁忙的腳本進行通信

[英]V8 communicating with busy script

通過v8,我正在運行javascript,它正在等待引擎端的輸入。 參見下面的簡化示例。 問題在於Run()處於阻塞狀態,並且標志從未設置為0。我還嘗試在新線程中執行Run(),結果是出現訪問沖突錯誤。

有沒有一種簡單的方法可以與正在運行的Javascript代碼進行通信? 如果需要單獨的線程,請問我缺少什么?

預先非常感謝您的幫助!

int flag = 1;

static void getFlag(v8::Local<v8::String> property, 
    const v8::PropertyCallbackInfo<v8::Value>& info) {

    info.GetReturnValue().Set(flag);
}

...
objtemplate->SetAccessor(String::NewFromUtf8(isolate, "flag"), getFlag);
...
Handle<String> source = String::NewFromUtf8(isolate, "while(flag) { ... }");
Handle<Script> script = Script::Compile(source);
script->Run();

flag = 0;

這是我的多線程方法:

void runner(v8::Handle<v8::Script> * script) {
    (*script)->Run();
}

CreateThread(0, 0, (LPTHREAD_START_ROUTINE) runner, (LPVOID) &script, 0, 0);

無需詳細說明為什么上述方法不起作用:您要實現的目標是JavaScript中的多線程。 那不存在。 JavaScript是設計上的單線程語言。 並發是異步的。 和其他所有JS VM一樣,V8是一個單線程引擎。 多個線程訪問同一隔離的唯一方法是通過全局mutax(請參閱Locker類)。

簡而言之,嘗試使用基於多線程的編程方法來處理JavaScript並不會幫助您。 這不是它的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM