一、基本概览
- 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); |
---|