如何杀死铬嵌入式框架子进程?
How to kill chromium embedded framework subprocess?
在 PC 游戏中,我有用于新闻、虚拟货币商店和社交网络的游戏内浏览器。它是用 Chromium Embedded Framework 的全新更新构建的。问题是当我打开浏览器 window(网站在那里工作正常)然后关闭时,对于某些网站,CEF 子进程没有完成。我也可能会继续听到音频,例如,如果是 Youtube 视频。我使用离屏渲染,其他原生windows没有创建,只有子进程。要关闭浏览器 window 我删除所有对 CefBrowser 的引用并调用:
m_browser->GetHost()->CloseBrowser(true);
我还尝试了其他方法来 close/destroy/finalize 渲染子进程,例如在关闭前加载 'about:blank',但这没有帮助:进程保持唤醒状态,音频继续播放。
重要说明:它只发生在某些网站上,我想这些网站使用了某些功能,而其他网站则没有。当我尝试在 CEF 设置中禁用 JavaScript 时,错误消失了,但我需要 JS。
- 有没有办法强制终止浏览器子进程? (注意 GetWindowHandle returns 0,因为它没有 window)
- 还有其他我不知道的正确终止浏览器的方法吗?
- 网站的哪些功能可能导致此类错误?
谢谢!
CEF 运行时配置:多进程、单线程消息循环、带子进程路径、window较少渲染、无沙箱。
电脑配置:OS Windows8、VS 2010、Chromium Embedded Framework 版本 3.3071、build 1649、C++ 语言。
您应该检查您对 onbeforeunload 的实现。
CEF GeneralUsage 写到 CefBrowserHost::CloseBrowser:
父 window 然后需要调用 CloseBrowser(false) 并等待第二个 OS 关闭事件以指示浏览器已允许关闭。如果关闭被 JavaScript ‘onbeforeunload’ 事件处理程序或 DoClose() 回调取消,则不会发送第二个 OS 关闭事件。
如果您仍然只想终止子进程,我建议您使用浏览器 IPC 消息并在应用程序中退出。
在你的游戏中 运行
CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create(KILL_subprocess);
m_browser->SendProcessMessage(PID_RENDERER, msg);
并在子流程中实现“OnProcessMessageReceived”:
if (msg->GetName() == KILL_subprocess)
{
delete this;
std::exit(EXIT_FAILURE);
}
在 PC 游戏中,我有用于新闻、虚拟货币商店和社交网络的游戏内浏览器。它是用 Chromium Embedded Framework 的全新更新构建的。问题是当我打开浏览器 window(网站在那里工作正常)然后关闭时,对于某些网站,CEF 子进程没有完成。我也可能会继续听到音频,例如,如果是 Youtube 视频。我使用离屏渲染,其他原生windows没有创建,只有子进程。要关闭浏览器 window 我删除所有对 CefBrowser 的引用并调用:
m_browser->GetHost()->CloseBrowser(true);
我还尝试了其他方法来 close/destroy/finalize 渲染子进程,例如在关闭前加载 'about:blank',但这没有帮助:进程保持唤醒状态,音频继续播放。 重要说明:它只发生在某些网站上,我想这些网站使用了某些功能,而其他网站则没有。当我尝试在 CEF 设置中禁用 JavaScript 时,错误消失了,但我需要 JS。
- 有没有办法强制终止浏览器子进程? (注意 GetWindowHandle returns 0,因为它没有 window)
- 还有其他我不知道的正确终止浏览器的方法吗?
- 网站的哪些功能可能导致此类错误?
谢谢!
CEF 运行时配置:多进程、单线程消息循环、带子进程路径、window较少渲染、无沙箱。
电脑配置:OS Windows8、VS 2010、Chromium Embedded Framework 版本 3.3071、build 1649、C++ 语言。
您应该检查您对 onbeforeunload 的实现。
CEF GeneralUsage 写到 CefBrowserHost::CloseBrowser: 父 window 然后需要调用 CloseBrowser(false) 并等待第二个 OS 关闭事件以指示浏览器已允许关闭。如果关闭被 JavaScript ‘onbeforeunload’ 事件处理程序或 DoClose() 回调取消,则不会发送第二个 OS 关闭事件。
如果您仍然只想终止子进程,我建议您使用浏览器 IPC 消息并在应用程序中退出。 在你的游戏中 运行
CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create(KILL_subprocess);
m_browser->SendProcessMessage(PID_RENDERER, msg);
并在子流程中实现“OnProcessMessageReceived”:
if (msg->GetName() == KILL_subprocess)
{
delete this;
std::exit(EXIT_FAILURE);
}