CEF 浏览器和多线程

CEF Browser and multiple threads

请解释一下:

假设我同时创建了三个浏览器并开始在其中加载 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 的加载将停止。

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

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

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

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