天天看點

CEF3研究(一)

一、基本概覽

  1. C++ Wrapper

    C++Wrapper(包裝類)就是将C結構包裝C++類。 這是C/C++API轉換層通過translator tool自動産生的。

  2. 程序

    CEF3用多程序運作。     

  1. 主(浏覽)程序 ——處理視窗建立,繪制和網絡通路,會産生相同的程序作為主應用程式,及處理主應用程式的邏輯。
  2. 渲染程序——處理閃爍渲染和JavaScript的執行,也處理一些應用程式邏輯,如JavaScript綁定和DOM的通路。
  3. scheme + domain程序——預設的程序模型的渲染程序。每個程序有唯一的源
  4. 其他程序,如插件程序、gpu處理,是按需要産生的。

     預設的主應用程式可執行檔案會分多次産生獨立程序,這是通知command-line 辨別傳遞給CefExecuteProcess函數。如果主應用程式執行大加載任務非常耗時,或是其他不适合在非浏覽程序的任務可分多少可執行檔案在其他程式中。這可通過 CefSettings.browser_subprocess_path 進行配置      由CEF3産生的程序用IPC進行通信,浏覽程序和渲染程序的應用邏輯通信是通過來回異步發送消息。而在渲染程序中JavaScript的通信是調用異步ap

 3. 線程

     在CEF3中每個程序以多線程運作。  cef_thread_id_t枚舉定義了所有線程清單。浏覽程序包含4個線程:

  1. TID_UI 是浏覽程序的主線程,如果主應用程式線程調用  CefInitialize()以CefSettings.multi_threaded_message_loop = false調用,那麼主應用程式線程也是TID_UI.
  2. TID_IO 在浏覽程序中用于處理程序IPC和網絡消息。
  3. TID_FILE在浏覽程序中用于與檔案系統互動
  4. TID_RENDERER在渲染程序的主線程

     由于CEF本身是多線程,線上程中需要對通路的資料和傳遞的消息進行加鎖。CEF3提供Lock和Unlock方法進行加鎖,AutoLock塊對象對代碼進行同步通路。      CefPostTask家族函數支援在兩個線程之間進行消息傳遞。        可以驗證目前線程使用CefCurrentlyOn()函數,也可以使用以下宏,驗證目前線程      #define CEF_REQUIRE_UI_THREAD()       DCHECK(CefCurrentlyOn(TID_UI));      #define CEF_REQUIRE_IO_THREAD()       DCHECK(CefCurrentlyOn(TID_IO));      #define CEF_REQUIRE_FILE_THREAD()     DCHECK(CefCurrentlyOn(TID_FILE));      #define CEF_REQUIRE_RENDERER_THREAD() DCHECK(CefCurrentlyOn(TID_RENDERER)); 4. 引用計數      CEF3的所有類及自己寫的類都要實作CefBase接口,所有類的執行個體都通過CefRefPtr智能指針管理,CefRefPtr實作自動引用計數,AddRef和Release函數對引用計數進行加減。

     IMPLEMENT_REFCOUNTING(MyClass);//讓本類支援引用計數

5. 字元串

     CEF自定義字元串,有如下不同的原因:

  1.  libcef庫和主應用程式可以使用不同的運作時管理堆記憶體,所有的對象或字元串都需要在同一個運作時釋放申請的空間
  2.  libcef庫可以支援不同形式的字元串類型(UTF8, UTF16和wide).預設使用UTF16,可修改cef_string.h的相關宏來改變。

     CEF3字元串的使用:

    • cef_string_set will assign a string value to the structure with or without copying the value.
    • cef_string_clear will clear the string value.
    • cef_string_cmp will compare two string values.

     在C++中使用CefString類表示字元串,CefString提供了從UFT8到std::wstring字元串的轉換功能。

  1. std::string和CefString 互相轉換
std::string  str =  “ Some  UTF8  string ”; //  Equivalent  ways  of  assigning | str|  to | cef_str|.  Conversion  from  UTF8  will  occur  if  necessary. CefString  cef_str( str); cef_str =  str; cef_str .FromString( str);  //  Equivalent  ways  of  assigning | cef_str|  to | str|.  Conversion  to  UTF8  will  occur  if  necessary.  str =  cef_str;  str =  cef_str .ToString();

     2. std::wstring和CefString 互相轉換

  std::wstring  str =  “ Some  wide  string ”;  //  Equivalent  ways  of  assigning | str|  to | cef_str|.  Conversion  from  wide  will  occur  if  necessary. CefString  cef_str( str); cef_str =  str; cef_str .FromWString( str); //  Equivalent  ways  of  assigning | cef_str|  to | str|.  Conversion  to  wide  will  occur  if  necessary. str =  cef_str;  str =  cef_str .ToWString();

     3. ASCII(char)和CefString之間轉換

const char* cstr = “Some ASCII string”;  CefString cef_str;  cef_str.FromASCII(cstr);

4.cef_string_t 和CefString之間轉換

CefSettings settings;
const char* path = “/path/to/log.txt”;

// Equivalent assignments.
CefString(&settings.log_file).FromASCII(path);
cef_string_from_ascii(path, strlen(path), &settings.log_file);