chromium之message_pump_win之一
写了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之一的更多相关文章
- chromium之message_pump_win之三
上一篇分析MessagePumpForUI,参考chromium之message_pump_win之二 MessagePumpForIO,同MessagePumpForUI,也是要实现三个函数 // ...
- chromium之message_pump_win之二
接下来分析 MessagePumpForUI上一篇分析MessagePumpWin,可以参考chromium之message_pump_win之一 根据对MessagePumpWin的分析,Messa ...
- chromium之MessageLoop浅析
对chromium的MessageLoop非常感兴趣,接下来会详细分析Windows平台的具体实现. 代码版本:chromium-4.0.210.0_p26329 先看一下依赖的文件 message_ ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- Google之Chromium浏览器源码学习——base公共通用库(一)
Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...
- 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)
时隔一年,再次编译cef3,独一无二的目的仍为加入mp3支持.新版本的编译环境和注意事项都已经发生了变化,于是再记录一下. 一.编译版本 cef版本号格式为X.YYYY.A.gHHHHHHH X为主版 ...
- 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持
一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...
- 构建基于Chromium的应用程序
chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...
- ubuntu中chromium无法播放flash,安装flash
ubuntu14.0.4中系统自带的chromium无法播放flash,后来查了下,得知chromium已经不支持adobe flash了,用户可使用pepper flash替代.安装pepper f ...
随机推荐
- Java链接 Oracle11g R2
菜鸟学习Oracle数据库,使用Java代码链接数据库. 首先要配置Eclipse,在新建的工程中,Package Explorer->工程名->Build path->Add ex ...
- svn up (svn update) 状态缩写含义
A:add,新增 C:conflict,冲突 D:delete,删除 M:modify,本地已经修改 G:modify and merGed,本地文件修改并且和服务器的进行合并 U:upda ...
- linux常用命令(50个)
1. find 基本语法参数如下: find [PATH] [option] [action] # 与时间有关的参数: -mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件: - ...
- 页面引入(include)方式的研究及性能比较
1. 应用Html中的框架(iframe) 目前大多数门户网站都应用iframe来进行页面上广告的投放,就是将不同的广告分别应用iframe投放到主页面上,优点是效率高,互不影响,缺点是不符合网页标准 ...
- cocos2d-x 3.1 编译脚本android-build.py
写在前面: 前段时间下载了cocos2d-x 3.1,按照官网的教程,配置环境,编译打包,走了一遍,感觉不错,顺便发现其中用了很多python的脚本文件,比如今天要说的android-build.py ...
- Linux文件的I/O操作
C标准函数与系统函数的区别 标准函数printf调用应用层api,然后应用层api调用内核层api,再通过内核层api调用硬件设备 一个pirntf打印helloworld那么sys_writ ...
- ZT 骆家辉宣布辞职 他给中国带来什么留下什么?
骆家辉宣布辞职 他给中国带来什么留下什么? 字号|2013年11月20日 15:20 已有1933人阅读 57 导 读 美国驻华大使骆家辉20日上午发表声明,宣布辞职.骆家辉履任期间为中国 ...
- ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]
http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...
- C++11学习之share_ptr和weak_ptr
一.shared_ptr学习 1.shared_ptr和weak_ptr 基础概念 shared_ptr与weak_ptr智能指针均是C++ RAII的一种应用,可用于动态资源管理 shared_pt ...
- Tomcat的webapps目录下的classes文件夹下缺失编译好的.class文件原因及其解决方法
右键,选择BuildPath: 可以编辑Output folder,指定编译后的文件的存放目录,一般是target/classes目录