我特林创建一个JavaScript对象将其传递给函数回调像以下:C++中的自定义线程创建CEF对象
void MyClass::ThreadTaskOnSuccess(CefRefPtr<CefV8Value> callback, CefRefPtr<CefV8Context> callbackCtxt)
{
if (!CefCurrentlyOn(TID_UI))
{
// switch to UI thread
CefPostTask(TID_UI, NewCefRunnableMethod(this, &NewDownloadObject::CreateTempDownloadOnSuccess, callback, callbackCtxt));
return;
}
// String creation works perfect!
// CefRefPtr<CefV8Value> executionResult = CefV8Value::CreateString("test");
// "Access violation" will be thrown
CefRefPtr<CefV8Value> executionResult = CefV8Value::CreateObject(NULL);
executionResult->SetValue("size", CefV8Value::CreateInt(123), V8_PROPERTY_ATTRIBUTE_NONE);
executionResult->SetValue("fileName", CefV8Value::CreateString("some name of file"), V8_PROPERTY_ATTRIBUTE_NONE);
CefV8ValueList args;
args.push_back(executionResult);
CefRefPtr<CefV8Value> retval;
CefRefPtr<CefV8Exception> exception;
if (callback->ExecuteFunctionWithContext(callbackCtxt, callbackCtxt->GetGlobal(), args, retval, exception, false))
{
if (exception.get())
{
throw CFdmException(exception->GetMessage().c_str());
}
else
{
// Execution succeeded.
}
}
}
但CefV8Value ::的CreateObject(NULL)始终返回null结果。我想这是因为代码是运行在自定义线程,因为一些任务必须在特殊线程中执行。
我对不对?以及如何切换到cef线程与V8引擎一起工作并与其同步?
我错了吗?为什么V8创建一个空对象?
更新
我加入UI线程切换。之后,我总是在cef_v8value_create_object中出现“Access violation reading location”异常,例如the Hzmy's quiestion。
会惊喜我,如果V8是线程安全的(当然,一个单一实例),或者甚至线程感知。你尝试过只是添加锁定? – sehe
锁定并没有帮助,因为v8只是创建一个null对象:( – JohanTG