【问题标题】:How to kill chromium embedded framework subprocess?如何杀死铬嵌入式框架子进程?
【发布时间】:2017-09-01 13:00:57
【问题描述】:

在 PC 游戏中,我有用于新闻、虚拟货币商店和社交网络的游戏浏览器。它是用 Chromium Embedded Framework 的全新更新构建的。问题是当我打开浏览器窗口(网站在那里运行良好)然后关闭时,某些网站的 CEF 子进程没有完成。例如,如果是 Youtube 视频,我也可能会继续听到音频。我使用离屏渲染,不创建其他本机窗口,仅创建子进程。要关闭浏览器窗口,我删除所有对 CefBrowser 的引用并调用:

m_browser->GetHost()->CloseBrowser(true);

我还尝试了其他方法来关闭/销毁/完成该渲染子进程,例如在关闭之前加载“about:blank”,但这无济于事:进程保持清醒,音频继续播放。 重要提示:它只发生在某些网站上,我想这些网站使用了某些功能,而其他网站则没有。当我尝试在 CEF 设置中禁用 JavaScript 时,错误消失了,但我需要 JS。

  1. 有没有办法强制杀死浏览器子进程? (注意 GetWindowHandle 返回 0,因为它没有窗口)
  2. 是否有另一种方法可以正确终止我不知道的浏览器?
  3. 网站的哪些功能可能导致此类错误?

谢谢!

CEF 运行时配置:多进程、单线程消息循环、带子进程路径、无窗口渲染、无沙箱。

PC 配置:操作系统 Windows 8、VS 2010、Chromium Embedded Framework 版本 3.3071、build 1649、C++ 语言。

【问题讨论】:

  • 拨打CefShutdown(),问题是否依然存在?

标签: c++ chromium-embedded


【解决方案1】:

您应该检查 onbeforeunload 的实现。

CEF GeneralUsage 写了关于 CefBrowserHost::CloseBrowser: 然后父窗口需要调用 CloseBrowser(false) 并等待第二个 OS 关闭事件以指示浏览器已允许关闭。如果关闭被 JavaScript 'onbeforeunload' 事件处理程序或 DoClose() 回调取消,则不会发送第二个操作系统关闭事件。

如果您仍然想杀死子进程,我建议您使用浏览器 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);
}

【讨论】:

  • “在子进程中”是什么意思?
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多