netease-im / NIM_Duilib_Framework

网易云信Windows应用开发框架。
MIT License
2.1k stars 835 forks source link

cef 崩溃 #416

Closed abc-xyz-123-maker closed 2 years ago

abc-xyz-123-maker commented 2 years ago

频繁的点击 browser demo中 新建tab默认访问www.sina.com.cn,关闭tab,,未等网页加载完毕马上关闭刚刚新建的tab, 会出现崩溃;崩溃地点有二处,出现概率比较低。

第一处:BrowserHandler::OnPaint 中 PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnPaint, handledelegate 这里, 猜猜 handledelegate 生命周期属于UI线程,再CEF线程中使用它似乎有问题,BrowserHandler 是 CEF 线程拥有 引用的对象,我把它绑定到 BrowserHandler::OnPaintByUI, 再由OnPaintByUI 来调用 HandlerDelegate::OnPaint 哈哈,我是名程序员,但没有把握这是不是 bug。 修改: //加引用,在OnPaintUIImp平衡引用,必要吗 ? Bind里的WeakFlag 是否起到作用,不知道哦 ^v^ this->AddRef(); nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&BrowserHandler::OnPaintUIImp, this, browser, type, dirtyRects, &paintbuffer, width, height)); //nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnPaint, handledelegate, browser, type, dirtyRects, &paintbuffer, width, height)); 第二处:

关闭 tab时: 似乎消息有嵌套。
LRESULT Window::DoHandlMessage 中 for 循环 m_aMessageFilters 时,似乎,cef 控件已经销毁,但它还存在m_aMessageFilters 中,接下for 循环时,会遇到野指针。
这个现象不是必现,
nmgwddj commented 2 years ago

您应该保证,所有操作 UI 相关的任务都始终在 kThreadUI 线程中。