这是一个非常简单的QT+CEF Windows应用程序,参见https://github.com/GreatTux/CefMinGWQt
当我关闭主窗口时CEF触发断点: 我想我在这里失败了:
void CefBrowserMainParts::PostMainMessageLoopRun() {
....
#ifndef NDEBUG
// No CefBrowserContext instances should exist at this point.
DCHECK_EQ(0, CefBrowserContext::DebugObjCt);
#endif
}
我不知道释放浏览器资源的正确方法是什么,我在网上看了很多例子,几乎所有的例子都在我的Windows 7+vs2010环境下遇到了这个问题
我也尝试过,但不起作用
void ClientHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
if(m_browser.get())
m_browser = NULL;
====跟踪===
libcef.dll!base::debug::BreakDebugger() Line 21 C++
libcef.dll!logging::LogMessage::~LogMessage() Line 604 C++
libcef.dll!CefBrowserMainParts::PostMainMessageLoopRun() Line 189 C++
libcef.dll!content::BrowserMainLoop::ShutdownThreadsAndCleanUp() Line 946 + 0x27 bytes C++
libcef.dll!content::BrowserMainRunnerImpl::Shutdown() Line 293 C++
libcef.dll!CefMainDelegate::ShutdownBrowser() Line 659 + 0x1b bytes C++
libcef.dll!CefContext::FinalizeShutdown() Line 462 C++
libcef.dll!CefContext::Shutdown() Line 345 C++
libcef.dll!CefShutdown() Line 171 C++
libcef.dll!cef_shutdown() Line 192 C++
qtloop.exe!CefShutdown() Line 180 + 0x8 bytes C++
qtloop.exe!main(int argc=1, char * * argv=0x00375b90) Line 35 C++
qtloop.exe!WinMain(HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000) Line 113 + 0xd bytes C++
qtloop.exe!__tmainCRTStartup() Line 547 + 0x2c bytes C
qtloop.exe!WinMainCRTStartup() Line 371 C
最佳答案
When you close the mainwindow, Qt not destory it immediately, so cef browser not release. And at this time app.exec() was return, and CefShowDown() was run and trigger the debug check.
我也遇到了同样的问题。 这是因为当你关闭Cef时还有不免费的浏览器
DCHECK_EQ(0, CefBrowserContext::DebugObjCt);
我读了这篇文章并阅读了cef close过程的源代码
https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_Close.md
问题我解决了,关键是,当你打电话的时候
GetHost()->CloseBrowser(false)
在cef上嵌入父窗口的closeEvent并忽略第一个closeEvent
如果用户允许关闭,那么 cef 将再次向父根窗口发送 close 消息。
void CefBrowserHostImpl::PlatformCloseWindow() {
if (window_info_.window != NULL) {
HWND frameWnd = GetAncestor(window_info_.window, GA_ROOT);
PostMessage(frameWnd, WM_CLOSE, 0, 0);
}
}
当您收到第二次关闭时,您需要确保立即关闭窗口并销毁cef嵌入的窗口。 Cef 需要 WM_DESTROY 事件来释放资源并调用 OnBeforeClose。
关于c++ - 应用程序退出时 CEF 崩溃(QT5+CEF3.2526),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38716266/