zoukankan      html  css  js  c++  java
  • CEF3开发者系列之进程间消息传递

    在使用CEF3作为框架开发过程中,实现WebSockets、XMLHttpRequest、JS与本地客户端交互等功能时,需要在渲染(Render)进程和浏览(Browser)进程中传递消息。CEF3在这个方面进行了很好的封装,普通用户只需要了解几个接口和函数就可以实现进程间消息传递。根据个人的开发经验和理解,以cefclient为例子总结下CEF3消息的传递机制,有不正确之处,请赐教!

    一般通过指定的CefBrowser实例,调用CefBrowser::SendProcessMessage()方法。由于CefBrowserCefFrame对象同时存在于browserrender进程中,所以不管在渲染(Render)进程还是浏览(Browser)进程中,都能调用到SendProcessMessage()方法。SendProcessMessage()有两个参数,进程标识CefProcessId与需要传递的消息CefProcessMessage。

    CefProcessId是一个枚举常量,具体代表的意义不解释,看如下所示代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef enum {
      ///
      // Browser process.
      ///
      PID_BROWSER,
      ///
      // Renderer process.
      ///
      PID_RENDERER,
    } cef_process_id_t;

     CefProcessMessage是一个管理所需传递消息的类,包含消息名称和消息内容。见下边代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create(CefString("xiaoximingcheng"));  //设置消息名称
     
    //检索参数列表对象(Retrieve the argument list object.)
    CefRefPtr<CefListValue> args = message->GetArgumentList();
    CefString  message_cont; 
     
     //设置消息内容
    args->SetString(0, message_cont);
    args->SetInt(0, 10)

     进程间传递消息,都要通过GetArgumentList获取和Set*(SetString、SetInt)来设置。所有render进程提供利用相同的消息传递方式:通过browser进程中的CefBrowserProcessHandler::OnRenderProcessThreadCreated()将消息传递给render进程中的CefRenderProcessHandler::OnRenderThreadCreated()。

    browser进程发到render进程的消息,被CefRenderProcessHandler::OnProcessMessageReceived()接收,从render进程发到browser进程的消息,被CefBrowserProcessHandler::OnProcessMessageReceived()接收。见下图:

     发送消息的过程前通过关联消息和frame ID(通过CefFrame::GetIdentifier()获取),接收消息进程在接收后,通过CefBrowser::GetFrame()获取Frame相关信息,从而让Frame和消息对应起来,让每个Frame可以处理自己消息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Helper macros for splitting and combining the int64 frame ID value.
    #define MAKE_INT64(int_low, int_high)
        ((int64) (((int) (int_low)) | ((int64) ((int) (int_high))) << 32))
    #define LOW_INT(int64_val) ((int) (int64_val))
    #define HIGH_INT(int64_val) ((int) (((int64) (int64_val) >> 32) & 0xFFFFFFFFL))
     
    // Sending the frame ID.
    const int64 frame_id = frame->GetIdentifier();
    args->SetInt(0, LOW_INT(frame_id));
    args->SetInt(1, HIGH_INT(frame_id));
     
    // Receiving the frame ID.
    const int64 frame_id = MAKE_INT64(args->GetInt(0), args->GetInt(1));
    CefRefPtr<CefFrame> frame = browser->GetFrame(frame_id);
  • 相关阅读:
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    PHP serialize() 函数
    PHP print_r() 函数
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/cef.html
Copyright © 2011-2022 走看看