通过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);
答案 0 :(得分:0)
没有详细说明上述原因无效的原因:您要实现的是JavaScript中的多线程。那不存在。 JavaScript是一种单线程语言。并发是异步的。和所有其他JS VM一样,V8是一个单线程引擎。多线程可以访问同一个隔离区的唯一方法是通过全局mutax(参见Locker类)。
简而言之,尝试使用基于多线程的编程方法来处理JavaScript将无法让您随处可见。这不是它的工作原理。