「深入解析 Chromium Message Pump:消息循環的核心驅動」

MessagePump 是 Chromium 中 消息循環(Message Loop) 的核心組件之一,負責在不同平臺上管理和分發消息、事件,并協調任務調度。

在瀏覽器這樣的 GUI 應用中,事件循環(Event Loop)是非常重要的,它處理:

  • UI 事件(鼠標、鍵盤輸入等)。

  • 定時任務setTimeoutsetInterval、Chromium 內部的 PostDelayedTask)。

  • 異步 I/O(如網絡請求、文件讀寫等)。

  • 任務隊列(如 TaskRunner 調度的任務)。

  • 平臺特定的消息機制(如 Windows 的 GetMessage,Mac 的 NSRunLoop)。


1. MessagePump 的核心作用

MessagePump 作為 Chromium 消息循環的底層抽象,它的職責包括:

  • 管理消息隊列,確保任務按正確的順序執行。

  • 調度任務,處理異步任務、定時任務(如 ScheduleDelayedWork)。

  • 與操作系統的事件系統交互,如 Windows 消息循環(WM_*)、Linux 的 epoll 或 macOS 的 CFRunLoop

  • 支持 UI、I/O、計算等不同類型的任務調度,不同的 MessagePump 子類適用于不同場景。


2. 代碼解析

(1)類定義

class BASE_EXPORT MessagePump {

  • BASE_EXPORT 用于控制符號導出,確保 MessagePump 可被不同模塊訪問。

  • MessagePump抽象基類,不同平臺(Windows、Mac、Linux)會有對應的子類實現,如:

    • MessagePumpForUI(UI 線程消息循環)。

    • MessagePumpForIO(異步 I/O 處理)。

    • MessagePumpForWorkQueue(任務隊列管理)。


(2)MessagePump::Delegate(消息循環的回調接口)

class BASE_EXPORT Delegate {

  • MessagePump 依賴 Delegate 處理具體的任務調度和執行邏輯。

  • Delegate 提供的方法:

    • DoWork():執行一次任務,并返回 NextWorkInfo 告訴 MessagePump 何時調用 DoWork()

    • DoIdleWork():當隊列中沒有任務時執行的 空閑任務

    • BeforeWait():在 MessagePump 進入等待狀態前調用(例如 UI 線程等待新的事件)。

    • BeginNativeWorkBeforeDoWork():如果 MessagePump 需要處理平臺特定的事件(如 Windows 消息隊列),可使用此方法。

struct NextWorkInfo { TimeTicks delayed_run_time; // 下一個任務的運行時間 TimeDelta leeway; // 任務調度的靈活度 TimeTicks recent_now; // 當前時間戳 bool yield_to_native = false; // 是否優先處理系統事件 };

  • NextWorkInfo 告訴 MessagePump 下一次應該做什么

    • is_immediate():是否有任務 需要立即執行

    • delayed_run_time:如果任務有延遲執行時間,則存儲該時間點。

示例

Delegate::NextWorkInfo next_work_info = delegate->DoWork(); if (next_work_info.is_immediate()) { // 立即執行下一個任務 } else { // 等待,直到下一個任務需要執行 }


(3)Run(Delegate* delegate)(核心事件循環)

virtual void Run(Delegate* delegate) = 0;

  • 這是 MessagePump 運行消息循環的 入口,所有消息處理都發生在這里。

  • 邏輯:

    1. 處理系統消息(如鼠標/鍵盤輸入)。

    2. 執行 DoWork() 任務。

    3. 進入 空閑等待,直到有新的事件觸發。

消息循環的偽代碼

for (;;) { bool did_native_work = DoNativeWork(); // 處理 UI / I/O 事件 if (should_quit_) break; Delegate::NextWorkInfo next_work_info = delegate->DoWork(); // 運行任務 if (should_quit_) break; if (did_native_work || next_work_info.is_immediate()) continue; delegate->DoIdleWork(); // 執行空閑任務 if (should_quit_) break; WaitForWork(); // 進入等待(等待新任務) }

  • UI 線程可能包含 DoNativeWork(),確保 UI 事件(如鼠標、鍵盤)不會卡住。

  • WaitForWork() 使線程 進入等待狀態,避免 CPU 空轉。


(4)Quit()(退出消息循環)

virtual void Quit() = 0;

  • MessagePump 立即退出,常用于:

    • 窗口關閉時,主事件循環退出。

    • 單元測試,防止死循環。


(5)ScheduleWork()(立即調度任務)

virtual void ScheduleWork() = 0;

  • 確保 DoWork() 盡快被調用,一般用于:

    • 異步任務觸發(如 PostTask() 調度)。

    • 優先級較高的任務

示例:

ScheduleWork(); // 讓消息循環立即喚醒執行任務


(6)ScheduleDelayedWork()(定時任務調度)

virtual void ScheduleDelayedWork( const Delegate::NextWorkInfo& next_work_info) = 0;

  • 設定 定時任務,當 next_work_info.delayed_run_time 到達時執行任務。

  • 適用于:

    • 定時器(setTimeout, setInterval)

    • 異步任務的延遲調度

示例:

Delegate::NextWorkInfo info; info.delayed_run_time = base::TimeTicks::Now() + base::Milliseconds(500); ScheduleDelayedWork(info); // 500ms 后執行任務


3. 關鍵子類

MessagePump 是一個 抽象類,不同的 MessagePump 適用于不同的任務類型:

子類用途
MessagePumpForUI處理 UI 事件(Windows GetMessage,macOS NSRunLoop
MessagePumpForIO處理 I/O 事件(如 epoll, WSAAsyncSelect
MessagePumpForWorkQueue處理普通任務隊列

示例:

std::unique_ptr<MessagePump> pump = MessagePump::Create(MessagePumpType::UI);


4. MessagePump 在 Chromium 瀏覽器中的作用

在 Chromium 瀏覽器中,MessagePump 主要用于:

  1. 主 UI 線程MessagePumpForUI

    • 處理 用戶輸入(鼠標、鍵盤)。

    • 處理 窗口消息WM_PAINT,窗口重繪)。

    • 觸發 頁面渲染任務

  2. 網絡線程MessagePumpForIO

    • 監聽 Socket 事件(如 HTTP 請求)。

    • 處理 異步 I/O 任務

  3. 定時任務ScheduleDelayedWork

    • 實現 JavaScript 的 setTimeout()

    • 控制 動畫幀渲染(如 requestAnimationFrame)。


5. 結論

  • MessagePumpChromium 事件循環的核心組件

  • Run() 方法控制消息循環,不斷執行任務、處理事件

  • ScheduleWork()ScheduleDelayedWork() 支持異步任務調度

  • Delegate::NextWorkInfo 決定何時執行下一個任務

  • 不同的子類 適用于 UI、I/O、定時任務等不同場景

如果你在 瀏覽器崩潰分析優化事件調度 方面做了工作,可以深入研究 MessagePump 及其子類的行為,看看是否有 任務調度異常、線程阻塞、CPU 占用高 等問題,并在你的匯報中體現對 事件驅動架構的理解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76301.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3d pose 指標和數據集

目錄 3D姿態估計、3維重建指標: 數據集 EHF數據集 SMPL-X 3D姿態估計、3維重建指標: MVE、PMVE 和 p-MPJPE 都是用于評估3D姿態估計、三維重建等任務中預測結果與真實數據之間誤差的指標。 MVE (Mean Vertex Error):是指模型重建過程中每個頂點的預測位置與真實位置之間…

大智慧大數據面試題及參考答案

目錄 MySQL 的事務隔離級別是什么? MySQL 的覆蓋索引是怎樣的? MySQL 常用的存儲引擎有哪些,它們之間的區別是什么? 在 MySQL 中,如果讀取很大的數據集,同時進行一邊 select 一邊寫入操作,結果會怎樣? 當 ES 出現分詞錯誤的情況時,應該如何處理? Kafka 如何保證…

微服務的簡單認識

目錄 一、微服務架構簡介 二、微服務架構風格和分布式系統架構的關系 三、微服務組成 一、微服務架構簡介 微服務是一種構建分布式系統的架構風格,它將一個大型的應用程序拆分成多個小型的、獨立部署的服務單元,每個服務單元都專注于特定的業務功能,并通過輕量級的通信機…

Spring的 @Conditional @ConditionalOnProperty 注解 筆記250330

Spring的 Conditional ConditionalOnProperty 注解 Spring 的 Conditional 與 ConditionalOnProperty 注解詳解 在 Spring 框架中&#xff0c;Conditional 和 ConditionalOnProperty 是用于動態控制 Bean 注冊的重要注解。雖然它們都服務于條件化配置&#xff0c;但定位和使用…

電路學習——MOS柵極驅動電阻取值(2025.03.30)

參考鏈接1: 驅動芯片的驅動電流的選型和計算 參考鏈接2: NMOS柵極驅動電阻Rg阻值和功率的計算&#xff0c;NMOS柵極驅動電阻Rg的作用&#xff0c;如何防止NMOS誤開通 單片機直接驅動NMOS的方法 RLC諧振電路 智能車BLDC 在此感謝各位前輩大佬的總結&#xff0c;寫這個只是為了記…

mysql JSON_ARRAYAGG聯合JSON_OBJECT使用查詢整合(數組對象)字段

父表數據&#xff08;表名&#xff1a;class&#xff09; idname1一年級2二年級3三年級 子表數據&#xff08;表名&#xff1a;students&#xff09; idnameclassId11張三112李四113小明3 關聯子表sql查詢&#xff08;推薦使用方法一&#xff09; 方法一 (使用IFNull判斷子…

張量-pytroch基礎(2)

張量-pytroch網站-筆記 張量是一種特殊的數據結構&#xff0c;跟數組&#xff08;array&#xff09;和矩陣&#xff08;matrix&#xff09;非常相似。 張量和 NumPy 中的 ndarray 很像&#xff0c;不過張量可以在 GPU 或其他硬件加速器上運行。 事實上&#xff0c;張量和 Nu…

marked庫(高效將 Markdown 轉換為 HTML 的利器)

文章目錄 前言使用基本使用自定義渲染器例子 代碼高亮 前言 最近嘗試了一下通過星火大模型將ai引入到項目上&#xff0c;但是ai返回的數據可以顯而易見的發現是markedown語法的&#xff0c;那么就需要一個工具&#xff0c;將類似這種的格式轉換為markdown格式 Marked 是一個用…

調用deepseek大模型時智能嵌入函數

DeepSeek-R1 當前炙手可熱,以其強大的自然語言處理和推理能力而廣受贊譽。饒是如此,卻并不原生支持函數調用(function_call),這是開發過程中不可或缺的一部分。雖有第三方調校的模型支持,然終非官方自帶,還需假以時日。本文雖然簡短,應該是全網寫得最通透的了吧。 …

SQLMesh系列教程:基于指標構建一致的分析語義層應用實踐

本文深入探討SQLMesh指標框架的核心概念、定義方法及應用場景。通過統一的語義層管理&#xff0c;SQLMesh解決了數據分析中指標定義不一致的痛點&#xff0c;實現了跨團隊協作的數據一致性。文章包含指標定義語法詳解、自動表連接機制解析、派生指標構建方法&#xff0c;并通過…

基于OpenCV+MediaPipe手部追蹤

一、技術棧 1. OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 性質&#xff1a;開源計算機視覺庫&#xff08;Library&#xff09; 主要功能&#xff1a; 圖像/視頻的基礎處理&#xff08;讀取、裁剪、濾波、色彩轉換等&#xff09; 特征檢測&#xf…

機器學習ML極簡指南

機器學習是現代AI的核心&#xff0c;從推薦系統到自動駕駛&#xff0c;無處不在。但每個智能應用背后&#xff0c;都離不開那些奠基性的模型。本文用最簡練的方式拆解核心機器學習模型&#xff0c;助你面試時對答如流&#xff0c;穩如老G。 線性回歸 線性回歸試圖通過"最…

裝飾器模式:如何用Java打扮一個對象?

引言裝飾器模式具體實例共有接口類具體被裝飾類抽象裝飾器類具體裝飾器類 測試裝飾器模式的實際應用Java I/O 體系游戲開發中的角色裝備系統 總結 引言 在生活中&#xff0c;我們都知道一句話&#xff0c;“人靠衣裝馬靠鞍”&#xff0c;如果想要讓自己在別人眼里看起來更加好…

【Easylive】HikariCP 介紹

【Easylive】項目常見問題解答&#xff08;自用&持續更新中…&#xff09; 匯總版 HikariCP 是目前 Java 生態中最快、最輕量級的高性能 JDBC 連接池&#xff0c;被 Spring Boot 2.x 及更高版本選為 默認數據庫連接池。它的名字來源于日語“光”&#xff08;Hikari&#xf…

清晰易懂的Cursor實現AI編程從安裝到實戰TodoList開發

一、Cursor簡介與安裝部署 什么是Cursor&#xff1f; Cursor是一款基于AI的智能代碼編輯器&#xff0c;它集成了強大的AI編程助手功能&#xff0c;能夠通過自然語言交互幫助開發者生成、優化和調試代碼。與傳統的代碼編輯器不同&#xff0c;Cursor可以理解你的編程意圖&#…

【Django】教程-2-前端-目錄結構介紹

【Django】教程-1-安裝創建項目目錄結構介紹 3. 前端文件配置 3.1 目錄介紹 在app下創建static文件夾, 是根據setting中的配置來的 STATIC_URL ‘static/’ templates目錄&#xff0c;編寫HTML模板&#xff08;含有模板語法&#xff0c;繼承&#xff0c;{% static ‘xx’ …

注意!ChatGPT 全新 AI 圖像功能延遲對免費用戶開放

2025 年 3 月 25 日&#xff0c;OpenAI 正式宣布在 ChatGPT 中推出基于 GPT-4o 模型的全新原生圖像生成功能。 這一功能允許用戶通過對話生成和編輯圖像&#xff0c;支持從寫實風格到插圖風格的多種形式。OpenAI 首席執行官薩姆?奧特曼&#xff08;Sam Altman&#xff09;在社…

優化webpack打包體積思路

Webpack 打包過大的問題通常會導致頁面加載變慢&#xff0c;影響用戶體驗。可以從代碼優化、依賴優化、構建優化等多個角度入手來減少打包體積&#xff1a; 代碼優化 &#xff08;1&#xff09;按需加載&#xff08;代碼拆分&#xff09; ① 路由懶加載 如果你的項目使用 Vu…

HarmonyOS Next~鴻蒙元服務開發指南:核心功能與實踐

HarmonyOS Next&#xff5e;鴻蒙元服務開發指南&#xff1a;核心功能與實踐 一、元服務核心概念 原子化服務定義 元服務&#xff08;原子服務&#xff09;是鴻蒙系統的核心架構單元&#xff0c;具備獨立業務能力的輕量化服務模塊&#xff0c;支持免安裝、跨設備調用和智能分發…

git錯誤:fatal: detected dubious ownership in repository at xxxxxx

1、報錯說明 這個錯誤通常是由于Git倉庫目錄的擁有者或權限問題引起的。Git檢測到倉庫目錄的所有權可能存在不一致或不安全的情況。 通常導致此報錯的可能原因&#xff1a; &#xff08;1&#xff09;文件或目錄的擁有者不一致&#xff1a; 倉庫目錄中的某些文件或子目錄可能…