CEF 浏览器和多个线程

CEF Browser and multiple threads

提问人:Optimus1 提问时间:4/10/2022 更新时间:4/11/2022 访问量:872

问:

请解释一下:

假设我同时创建了三个浏览器,并开始在其中加载 URL CefBrowserHost::CreateBrowser(...)。

接下来,加载转到 void OnLoadEnd() 上的示例。

在 OnLoadEnd() 中,我将检查线程 ID:

void OnLoadEnd() override
{
    std::cout << "OnLoadEnd_this_thread_ID:" << std::this_thread::get_id() << std::endl;
}

所有三个浏览器对 OnLoadEnd() 的所有调用都将具有相同的标识符线程。

事实证明,浏览器的加载会转到一个线程?

例如,如果只是为了一个例子,我在 OnLoadEnd() 中启动了某种繁重的计算,那么其余 URL 的加载将停止。

是否有可能以某种方式在不同的线程中运行浏览器?还是一样,所有浏览器只能在一个线程中工作?

铬嵌入

评论


答:

2赞 Vladimir 4/11/2022 #1

CEF 继承了 Chromium 多进程架构和线程模型。我想该函数是在 UI 线程上调用的。如果阻止它,您将阻止呈现 UI 并处理所有用户操作(如鼠标和键盘输入)的主 Chromium 线程。OnLoadEnd

我不认为通过阻止 UI 线程可以阻止加载其余 URL,因为 Chromium 在单独的 Chromium 进程中加载资源。所有网络活动都在那里工作。通过阻止 ,可以阻止其他通知,这些通知保留在消息队列中并等待释放 UI 线程。OnLoadEnd

无论如何,如果您需要启动某种繁重的计算,请在单独的线程中进行,并且不要阻止 Chromium UI 线程。