Как убить подпроцесс Chromium embedded framework?
в компьютерной игре у меня есть игровой браузер, используемый для новостей, магазина виртуальной валюты и социальных сетей. Он построен с довольно свежим обновлением Chromium Embedded Framework. Проблема в том, когда я открываю окно браузера (веб-сайт там работает нормально), а затем закрываю, для некоторых веб-сайтов подпроцесс CEF не заканчивается. Я также могу продолжать слышать звук, если это было видео Youtube, например. Я использую экранный рендеринг, другие собственные окна не создаются, только подпроцессы. Чтобы закрыть браузер окно я удаляю все ссылки на CefBrowser и вызываю:
m_browser->GetHost()->CloseBrowser(true);
Я также пробовал другие способы закрыть/уничтожить / завершить этот подпроцесс рендеринга, такие как загрузка "about:blank" перед закрытием, но это не помогло: процесс бодрствовал, звук продолжал играть. Важное примечание: это происходит только на определенных веб-сайтах, которые, я полагаю, используют некоторые функции, что другие нет. Когда я попытался отключить JavaScript в настройках CEF, ошибка исчезла, но мне нужен JS.
- Is есть способ принудительно убить подпроцесс браузера? (Обратите внимание, что GetWindowHandle возвращает 0, потому что у него нет окна)
- есть ли другой способ правильно завершить браузер, который я не знаю?
- какая особенность веб-сайтов может вызвать такую ошибку?
спасибо!
конфигурация времени выполнения CEF: мультипроцесс, однопоточный цикл сообщений, с подпроцессом, безоконный рендеринг, без песочницы.
конфигурация ПК: ОС Windows 8, VS 2010, Chromium Embedded Framework версии 3.3071, сборка 1649, язык C++.
2 ответов
вы должны проверить свою реализацию onbeforeunload.
CEF GeneralUsage пишет о CefBrowserHost:: CloseBrowser: затем родительское окно должно вызвать CloseBrowser (false) и дождаться второго события закрытия ОС, чтобы указать, что браузер разрешил закрыть. Второе событие закрытия ОС не будет отправлено, если закрытие отменено обработчиком событий 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);
}
foreach (var process in Process.GetProcessesByName("CefSharp.BrowserSubprocess"))
{
process.Kill()
}