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 线程。
请解释一下:
假设我同时创建了三个浏览器并开始在其中加载 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 线程。