当前位置: 首页 > 知识库问答 >
问题:

如何杀死chromium嵌入式框架子进程?

黎奇思
2023-03-14

在一个PC游戏中,我有ingame浏览器用于新闻、虚拟货币商店和社交网络。它是由Chromium嵌入式框架的全新更新构建的。问题是当我打开一个浏览器窗口(网站在那里工作良好),然后关闭,对于某些网站CEF子进程没有完成。我也可能继续听音频,如果是Youtube视频,例如。我使用的是屏幕外呈现,其他原生窗口不创建,只创建子进程。要关闭浏览器窗口,我删除对CefBrowser的所有引用并调用:

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

我还尝试了其他方法来关闭/销毁/结束render子进程,例如在关闭之前加载'about:blank',但这没有帮助:进程保持清醒,音频继续播放。重要提示:它只发生在某些网站上,我想这些网站使用了某些功能,而其他网站没有。当我试图在CEF设置中禁用JavaScript时,bug消失了,但我需要JS。

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

谢谢!

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

PC配置:操作系统Windows 8,VS 2010,Chromium Embedded Framework 3.3071,build 1649,C++语言.

共有1个答案

甘英光
2023-03-14

您应该检查OnBeforeUnload的实现。

CEF GeneralUsage写入关于CEFBrowserHost::CloseBrowser:然后父窗口需要调用CloseBrowser(false)并等待第二个OS close事件以指示浏览器已允许关闭。如果关闭被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);
}
 类似资料:
  • 问题内容: 我想制作一个桌面应用程序来浏览一个网站,我不想制作一个浏览器,而是一个浏览器嵌入的应用程序。我尝试过,但是发现了一些问题,例如缺少对插件的支持(例如:Flash,pdf查看器等)。 经过大量搜索后,我发现了Chromium嵌入式框架(CEF)或JCEF Java包装器,但我不知道如何在Java中使用它。 是否可以在Java应用程序中嵌入CEF / JCEF? 问题答案: 是否可以在Ja

  • 问题内容: 使用shelljs创建一个子进程 杀死父进程后,子进程仍在运行.. 问题答案: 如果您可以使用node的内置,则可以向子进程发送信号: 这样做的好处是,主进程应该一直徘徊,直到所有子进程都终止。

  • 问题内容: 我在Python中使用子进程包运行一个子进程,以后需要杀死它。但是,子流程包的文档指出,terminate()函数仅从2.6起可用。 我们正在运行带有2.5的Linux,并且出于向后兼容的原因,我无法升级到2.6,替代品是什么?我猜这些功能是某些事情的便捷方法。 问题答案: 您在进程pid上调用os.kill。 您还可以,因为您使用的是Linux。Windows用户很不走运。

  • 问题内容: 例如从bash: 仅杀死父进程。 问题答案: 当您将 负 PID传递给时,它实际上会通过该(绝对)数字将信号发送到过程 组 。您可以在Python中完成与之等效的操作。

  • 问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其

  • 我基本上是想让bash脚本永远运行节点脚本。我制作了以下bash脚本: 我希望当它运行时,它用给定的脚本启动节点,检查节点是否退出,如果退出,Hibernate6秒,然后重新打开节点。另外,我希望它在后台运行,并将其pid(bash pid)写入一个名为“pid”的文件中。 显然,上面解释的一切都如预期的那样工作,但我也期望当bash脚本的pid被杀死时,节点脚本将停止运行,我不知道为什么在我看来