[原創]嵌入CEF遇到的問題及解決方案
阿新 • • 發佈:2017-06-13
問題解決 pan single 如果 bottom 谷歌瀏覽器 進程間通訊 handle 沒有
這幾天程序嵌入谷歌瀏覽器,各種坑,不容易,記錄之。。。希望到此為止
1. 開了多進程模式之後,渲染進程RenderProcess斷點沒有進入。
只有在單進程模式(CefSingleProcess為true)下調試,渲染進程的斷點才會進入。如果開多進程模式,那麽渲染進程是在另外一個進程,不是主進程,當前調試進程是主進程,所以就沒法進入渲染進程的斷點,但是實際上,渲染進程的RenderProcessHandler的方法還是會被觸發的。
2. 在渲染進程操作瀏覽器進程沒有效果。
渲染進程(RenderProcess)和瀏覽器進程(BrowserProcess)之間的通訊必須通過進程間通訊才可以,直接調用是沒有效果的。不管是在多進程模式下還是在單進程模式下。
3. 多進程模式下進程間通訊傳接口地址失敗。
多進程模式下,進程不在同一個地址空間,不能直接傳地址,只能傳值類型。
4. 有下載的頁面打開後,再關閉程序後會自動啟動一次程序。
自動啟動程序應該是程序崩潰後CEF的機制,那麽問題應該是關閉時程序崩潰了。猜測是有下載頁面,CEF會啟動一個下載進程,而這個下載進程會關聯窗體,如果在CEF調用CefShutDown之前窗體已經釋放掉了,就會崩潰。所以我的辦法是在窗體釋放前就調用了CefShutDown,不知道是不是這個原因,反正問題解決了。
5. 快速打開很多頁面時整個程序會卡死。
猜測是GPU合成的問題,關閉後就沒有這個現象了。
6. 每開一個Tab都會創建一個進程。
參考下面的說明,根據需求開啟不同的進程模型。
- Process-per-site-instance:就是你打開一個網站,然後從這個網站鏈開的一系列網站都屬於一個進程。這是Chrome的默認模式。
- Process-per-site:同域名範疇的網站放在一個進程,比如www.google.com和www.google.com/bookmarks就屬於一個域名內(google有自己的判定機制),不論有沒有互相打開的關系,都算作是一個進程中。用命令行--process-per-site開啟。
- Process-per-tab:這個簡單,一個tab一個process,不論各個tab的站點有無聯系,就和宣傳的那樣。用--process-per-tab開啟。
- Single Process:這個很熟悉了吧,傳統瀏覽器的模式,沒有多進程只有多線程,用--single-process開啟。
7. 沒有了
[原創]嵌入CEF遇到的問題及解決方案