gpt4 book ai didi

c++ - 应用程序退出时CEF崩溃(QT5+CEF3.2526)

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:17 27 4
gpt4 key购买 nike

这是一个非常简单的 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 env 上遇到了这个问题

我也试过了,但是不行

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关闭过程的源代码
https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_Close.md

我解决了问题,关键是,当你调用

GetHost()->CloseBrowser(false)

在 cef 上嵌入父窗口的 closeEvent 并忽略第一个 closeEvent

如果用户允许关闭,cef 将再次发送关闭到父根窗口。

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com