老话题新提,还是那个退出报错的流程。
cef是个启动容易退出难的框架,毕竟不是我们自己设计的东西。
1.
用户发送了 WM_CLOSE 消息,我们要检测浏览器是否存在!
如果存在则调用TryCloseBrowser()或者

    if (Chromium::BrowserHandler::GetInstance() && Chromium::BrowserHandler::GetInstance()->IsClosing())
    {
            Chromium::BrowserHandler::GetInstance()->CloseHostBrowser(false); // 取消关闭
            event->ignore(); // 取消关闭窗口继续执行
    }

整个流程不由主线程执行,因为CEF的内核设计与QT大致相同。如果你的CEF是基于多线程的启动,外部线程调用这些有关于浏览器操作的函数退出时会报错,所以,我们就把一系列的操作都交给

    bool BrowserClosure::PostClosure(const base::Closure& closure)
    {
        return CefPostTask(TID_UI, CefCreateClosureTask(closure));
    }

这样我们将任务投递给UI线程进行内部执行。

我们取消关闭后,由CEF再一次发送 WM_CLOSE 消息。进行CEF内部消息循环关闭,这里我们不去多说。

接下来的流程就是调用 OnBeforeClose 停止浏览器做最后的清理操作。

最后在入口函数增加(在执行CefQuitMessageLoop之前一定要释放掉你所有初始化函数的内存,否则会有异常的错误。)
原因不明,因为你必须在退出CEF消息循环之前释放掉你用过所有函数的内存,可能在此之后释放的话内部有一些操作会用到消息循环,所以没有了消息循环就会报错。
CefQuitMessageLoop
CefShutdown

至此结束,具体代码请看https://github.com/X-Crack/Publisher/blob/master/Source/Browser/Browser.WinMain.cc

标签: none

添加新评论