写了22篇博文,终于到这里了———— MessagePumpWin!!!
MessagePumpWin这个类还是挺复杂的,可以分成好几部分。接下来分块分析

从介绍看,MessagePumpWin 是MessagePump在Windows平台的实现。

接下来分析下观察者模式,觉得最好的解释在这里chromium之observer_list
// MessagePumpWin serves as the base for specialized versions of the MessagePump
// for Windows. It provides basic functionality like handling of observers and
// controlling the lifetime of the message pump.
class MessagePumpWin : public MessagePump {
public:
// An Observer is an object that receives global notifications from the
// MessageLoop.
//
// NOTE: An Observer implementation should be extremely fast!
//
class Observer {
public:
virtual ~Observer() {} // This method is called before processing a message.
// The message may be undefined in which case msg.message is 0
virtual void WillProcessMessage(const MSG& msg) = ; // 在处理消息前调用 // This method is called when control returns from processing a UI message.
// The message may be undefined in which case msg.message is 0
virtual void DidProcessMessage(const MSG& msg) = ; // 当控制从处理UI消息返回时调用此方法。
}; // Add an Observer, which will start receiving notifications immediately.
void AddObserver(Observer* observer); // Remove an Observer. It is safe to call this method while an Observer is
// receiving a notification callback.
void RemoveObserver(Observer* observer); // Give a chance to code processing additional messages to notify the
// message loop observers that another message has been processed.
void WillProcessMessage(const MSG& msg);
void DidProcessMessage(const MSG& msg);

对应的实现,跟chromium之observer_list一模一样

void MessagePumpWin::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
} void MessagePumpWin::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
} void MessagePumpWin::WillProcessMessage(const MSG& msg) {
FOR_EACH_OBSERVER(Observer, observers_, WillProcessMessage(msg));
} void MessagePumpWin::DidProcessMessage(const MSG& msg) {
FOR_EACH_OBSERVER(Observer, observers_, DidProcessMessage(msg));
}

关键的第二部分

实现了MessagePump的两个接口Run和Quit

  // Like MessagePump::Run, but MSG objects are routed through dispatcher.
void RunWithDispatcher(Delegate* delegate, Dispatcher* dispatcher); // MessagePump methods:
virtual void Run(Delegate* delegate) { RunWithDispatcher(delegate, NULL); }
virtual void Quit();

再详细看下实现

void MessagePumpWin::RunWithDispatcher(
Delegate* delegate, Dispatcher* dispatcher) {
RunState s; // 将delegate和dispatcher放在一个类里,
s.delegate = delegate;
s.dispatcher = dispatcher;
s.should_quit = false;
s.run_depth = state_ ? state_->run_depth + : ; RunState* previous_state = state_;
state_ = &s; DoRunLoop(); //虚函数,有派生类负责实现 state_ = previous_state;
} void MessagePumpWin::Quit() {
DCHECK(state_);
state_->should_quit = true;
}

chromium之message_pump_win之一的更多相关文章

  1. chromium之message_pump_win之三

    上一篇分析MessagePumpForUI,参考chromium之message_pump_win之二 MessagePumpForIO,同MessagePumpForUI,也是要实现三个函数 // ...

  2. chromium之message_pump_win之二

    接下来分析 MessagePumpForUI上一篇分析MessagePumpWin,可以参考chromium之message_pump_win之一 根据对MessagePumpWin的分析,Messa ...

  3. chromium之MessageLoop浅析

    对chromium的MessageLoop非常感兴趣,接下来会详细分析Windows平台的具体实现. 代码版本:chromium-4.0.210.0_p26329 先看一下依赖的文件 message_ ...

  4. QT5利用chromium内核与HTML页面交互

    在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...

  5. Google之Chromium浏览器源码学习——base公共通用库(一)

    Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...

  6. 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)

    时隔一年,再次编译cef3,独一无二的目的仍为加入mp3支持.新版本的编译环境和注意事项都已经发生了变化,于是再记录一下. 一.编译版本 cef版本号格式为X.YYYY.A.gHHHHHHH X为主版 ...

  7. 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持

    一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...

  8. 构建基于Chromium的应用程序

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  9. ubuntu中chromium无法播放flash,安装flash

    ubuntu14.0.4中系统自带的chromium无法播放flash,后来查了下,得知chromium已经不支持adobe flash了,用户可使用pepper flash替代.安装pepper f ...

随机推荐

  1. create-react-app找不到配置项

    npm run eject 这个一个不可逆过程,一旦你执行了,就不能回到初始化

  2. C++ VS编译问题--VS下生成DLL,但没有生成Lib的解决办法

    如果项目生成了.dll文件,但是没有生成.lib文件,这是由于项目的设置错误,应作如下修改: 项目->属性->链接器->输入->模块定义文件,设置你的模块定义文件,默认为lib ...

  3. Java中由Calendar类获取的月、天和小时的简单处理

    在Java中,Calendar是日期处理的一个重要的类.但是,我们使用Calendar获取的月份,天,小时等可能需要进行简单的处理才能满足我们的需要.比如,月份范围是0-11,而我们可能需要的是1-1 ...

  4. mysql游标的用法及作用

    1当前有三张表A.B.C其中A和B是一对多关系,B和C是一对多关系,现在需要将B中A表的主键存到C中:常规思路就是将B中查询出来然后通过一个update语句来更新C表就可以了,但是B表中有2000多条 ...

  5. 二进制中 1 的个数(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个 ...

  6. JS复制DOM元素文字内容

    要实现的效果:将HTML页面中的某个DOM元素例如DIV下面的文本内容进行复制. 实现过程如下: <html> <head> <title>Copy text De ...

  7. linux下安装及配置jenkins

    jenkins常用的有两种安装方式: 1.直接下载war包jenkins.war,下载地址https://jenkins.io/download 直接下载 1.1.可以把war包直接部署到servle ...

  8. 如何向数据库中添加TIMESTAMP(6)类型的数据

    to_timestamp('2011-11-11 11:11:11.1','yyyy-mm-dd hh24:mi:ss.ff')

  9. Linux入门-2 VIM基础

    启动与退出 模式 进入插入模式 命令 删除.复制.粘贴 光标控制 查找与替换 EX模式 启动与退出 vim只启动vim vim <filename>打开文件,如果不存在则新建 模式 Nor ...

  10. mysql实现‘主从复制’

    mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 首先准备多台服务器,其中一台作为主服务器,从服务器数量自定. 1.主从服务器分别作以下操作: 主服务器 ...