一、基本概覽
- C++ Wrapper
C++Wrapper(包裝類)就是將C結構包裝C++類。 這是C/C++API轉換層通過translator tool自動產生的。 - 進程
CEF3用多進程運行。
- 主(瀏覽)進程 ——處理窗口創建,繪制和網絡訪問,會產生相同的進程作為主應用程序,及處理主應用程序的邏輯。
- 渲染進程——處理閃爍渲染和JavaScript的執行,也處理一些應用程序邏輯,如JavaScript綁定和DOM的訪問。
- scheme + domain進程——默認的進程模型的渲染進程。每個進程有唯一的源
- 其他進程,如插件進程、gpu處理,是按需要產生的。
默認的主應用程序可執行文件會分多次產生獨立進程,這是通知command-line 標識傳遞給CefExecuteProcess函數。如果主應用程序執行大加載任務非常耗時,或是其他不適合在非瀏覽進程的任務可分多少可執行文件在其他程序中。這可通過 CefSettings.browser_subprocess_path 進行配置
由CEF3產生的進程用IPC進行通信,瀏覽進程和渲染進程的應用邏輯通信是通過來回異步發送消息。而在渲染進程中JavaScript的通信是調用異步ap
3. 線程
在CEF3中每個進程以多線程運行。
cef_thread_id_t枚舉定義了所有線程列表。瀏覽進程包含4個線程:
- TID_UI 是瀏覽進程的主線程,如果主應用程序線程調用 CefInitialize()以CefSettings.multi_threaded_message_loop = false調用,那么主應用程序線程也是TID_UI.
- TID_IO 在瀏覽進程中用於處理進程IPC和網絡消息。
- TID_FILE在瀏覽進程中用於與文件系統交互
- 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自定義字符串,有如下不同的原因:
- libcef庫和主應用程序可以使用不同的運行時管理堆內存,所有的對象或字符串都需要在同一個運行時釋放申請的空間
- 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字符串的轉換功能。
- 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); |
---|