V8。保存&从c ++调用JavaScript函数

时间:2017-05-28 13:33:59

标签: c++ v8 embedded-v8

我正在尝试在我的c ++应用程序中保存JavaScript函数,并从另一个线程调用它。

但是我在Console.exe中的0x0101B5D5处得到了#34;未处理的异常:0xC0000005:访问冲突读取位置0x00000017。"

保存JavaScript函数(在requestCallbacks向量中):

Handle<Value> HttpEngine::addListener(const Arguments& args)
{
    Locker locker;
    HandleScope scope;

    HttpEngine* pThis = UnwrapHttpEngine( args.This() );

    Persistent<Function> callback = Persistent<Function>::New(Handle<Function>::Cast(args[0]));
    pThis->requestCallbacks.push_back(*callback);

    return Boolean::New(true);
}

尝试从另一个线程调用它:

void HttpEngine::emit()
{
    Locker locker;
    HandleScope scope;

    for (size_t i = 0; i < requestCallbacks.size(); i++)
    {
        Persistent<Function> func = static_cast<Function*>(requestCallbacks[i]);

        Handle<Value> args[1];
        args[0] = v8::String::New("http://google.com");
        func->Call(Context::GetCurrent()->Global(), 1, args);
    }
}

JavaScript代码(其中httpEngine是全局范围内的c ++对象):

httpEngine.addListener(function (url) {
    print('on request: ' + url);
});

1 个答案:

答案 0 :(得分:0)

requestCallbacks的类型是什么?尝试将Persistent<Function>放在那里,而不是原始Function*(在*上使用Persistent运算符既不受支持,也绝对不是您想要做的事情。< / p>