C ++在自定义线程中创建cef对象

约翰·TG

我正在尝试创建一个JavaScript对象,以将其传递给函数回调,如下所示:

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)始终返回空结果。我猜发生这种情况是因为代码自定义线程中运行,因为某些任务必须在特殊线程中执行。

我对吗?以及如何切换到CEF线程以与V8引擎一起工作并与其同步?

我错了吗?为什么V8创建一个空对象?

更新

我添加了UI线程切换。之后,我总是在cef_v8value_create_object中出现“访问冲突读取位置”异常,就像Hzmy的quiestion一样

约翰·TG

嵌入铬的文档包含以下内容:

因此,在使用javascript模型进行操作之前,您应该打开正确的连接。如果V8当前不在上下文中,或者需要检索和存储对上下文的引用,则可以使用两个可用的CefV8Context静态方法之一。GetCurrentContext()返回当前正在执行JS的框架的上下文。GetEnteredContext()返回JS执行开始的框架的上下文。例如,如果frame1中的函数调用frame2中的函数,则当前上下文将为frame2,而输入的上下文将为frame1。

如果V8在上下文中,则只能创建,修改和执行数组,对象和函数,就函数而言,只能执行。如果V8不在上下文中,则应用程序需要通过调用Enter()进入上下文并通过调用Exit()退出上下文。仅应使用Enter()和Exit()方法:

  1. 在现有上下文之外创建V8对象,函数或数组时。例如,在创建JS对象以响应本机菜单回调时。

  2. 在当前上下文以外的上下文中创建V8对象,函数或数组时。例如,如果源自frame1的呼叫需要修改frame2的上下文。

这就是为什么我无法创建对象但能够创建js字符串的原因。您还可以看到一般用法示例

下面的代码解决了这个问题:

if (callbackCtxt.get() && callbackCtxt->Enter())
{
    CefRefPtr<CefV8Value> object = CefV8Value::CreateObject(NULL);
    // call ExecuteFunctionWithContext and perform other actions

    callbackCtxt->Exit();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++在线程中传递带有自定义对象的std :: function作为参数

来自分类Dev

在QML中创建自定义C ++对象并将其存储在C ++模型中

来自分类Dev

目标C:身份检查器中的自定义类创建该类的新对象?

来自分类Dev

如何在C#中创建用于描述对象的自定义语法?

来自分类Dev

目标C:身份检查器中的自定义类会创建该类的新对象?

来自分类Dev

如何在C#中创建用于描述对象的自定义语法?

来自分类Dev

使用ApplicationSettingsBase保存自定义设置的C#中的自定义对象的列表

来自分类Dev

C# 计算自定义类数组中的自定义类对象

来自分类Dev

使用自定义列和自定义顺序在C#中创建datagrid的报告

来自分类Dev

组合框中的C#自定义对象

来自分类Dev

C ++在向量中对自定义对象进行排序

来自分类Dev

在C ++中增加自定义对象数组的大小

来自分类Dev

如何使用C ++中的自定义比较创建集合

来自分类Dev

如何在C ++中创建自定义整数序列

来自分类Dev

使用C ++在Qt中创建自定义属性

来自分类Dev

如何在C#中创建自定义事件

来自分类Dev

如何在(C#)中创建自定义光标

来自分类Dev

在C ++中创建自定义类的本机数组

来自分类Dev

使用C ++在Qt中创建自定义属性

来自分类Dev

如何在C#中创建自定义事件

来自分类Dev

在 C++ 中创建自定义类的多个实例

来自分类Dev

如何在C中创建自定义多个进程?

来自分类Dev

如何在C#中使用内联XAML轻松在代码隐藏中创建自定义对象

来自分类Dev

如何在C#中使用内联XAML轻松在代码隐藏中创建自定义对象

来自分类Dev

使用C API创建自定义类对象的numpy数组

来自分类Dev

C#:如何使用iText 7创建自定义大小的Document对象?

来自分类Dev

使用C ++中的对象功能创建线程

来自分类Dev

将自定义对象添加到C#中的选中列表框中

来自分类Dev

在C#中自定义ToolStripMenuItems

Related 相关文章

  1. 1

    C ++在线程中传递带有自定义对象的std :: function作为参数

  2. 2

    在QML中创建自定义C ++对象并将其存储在C ++模型中

  3. 3

    目标C:身份检查器中的自定义类创建该类的新对象?

  4. 4

    如何在C#中创建用于描述对象的自定义语法?

  5. 5

    目标C:身份检查器中的自定义类会创建该类的新对象?

  6. 6

    如何在C#中创建用于描述对象的自定义语法?

  7. 7

    使用ApplicationSettingsBase保存自定义设置的C#中的自定义对象的列表

  8. 8

    C# 计算自定义类数组中的自定义类对象

  9. 9

    使用自定义列和自定义顺序在C#中创建datagrid的报告

  10. 10

    组合框中的C#自定义对象

  11. 11

    C ++在向量中对自定义对象进行排序

  12. 12

    在C ++中增加自定义对象数组的大小

  13. 13

    如何使用C ++中的自定义比较创建集合

  14. 14

    如何在C ++中创建自定义整数序列

  15. 15

    使用C ++在Qt中创建自定义属性

  16. 16

    如何在C#中创建自定义事件

  17. 17

    如何在(C#)中创建自定义光标

  18. 18

    在C ++中创建自定义类的本机数组

  19. 19

    使用C ++在Qt中创建自定义属性

  20. 20

    如何在C#中创建自定义事件

  21. 21

    在 C++ 中创建自定义类的多个实例

  22. 22

    如何在C中创建自定义多个进程?

  23. 23

    如何在C#中使用内联XAML轻松在代码隐藏中创建自定义对象

  24. 24

    如何在C#中使用内联XAML轻松在代码隐藏中创建自定义对象

  25. 25

    使用C API创建自定义类对象的numpy数组

  26. 26

    C#:如何使用iText 7创建自定义大小的Document对象?

  27. 27

    使用C ++中的对象功能创建线程

  28. 28

    将自定义对象添加到C#中的选中列表框中

  29. 29

    在C#中自定义ToolStripMenuItems

热门标签

归档