初识chromium thread的实现
接触chromium已有一段时间,写点东西学习一下吧。
首先说一下用法,如何利用chromium封装好的thread类来开一个线程。在base里有一个封装该类的头文件thread.h,include它之后可以这样写一段代码(仅范例而已,具体用的时候要放在类里边儿的)
//a sample to use base::thread of chromium
//by zhouyoulie
//2014.03 int Fun( int para1,int para2 ); //creat a thread called thread_test
scoped_ptr<base::Thread> ThreadTest;
ThreadTest.reset(new base::Thread("thread_test")); //then start it
if (!ThreadTest->IsRunning())
ThreadTest->Start(); //use this thread to do some work which is defined in Fun
int para1,para2;
ThreadTest->message_loop()->PostTask
(FROM_HERE,NewRunnableMethod(this,&Fun, para1,para2)); ..................... //after finishing all the work,close this thread
ThreadTest->Stop();
线程用法简介
其实用法还是比较简单的,就是几个简单的API,大牛们封装了这么好的类,带着学习的心态,来一看究竟吧,不对的地方还求指正啊,哈哈
该类的构造函数没有做太多事情,就是初始化了一些诸如线程名称、线程id、消息循环变量等东西,代码如图1所示

图1
来看看start做了些什么事情

图2
首先用Options()初始化了一些选择信息,在StartWithOptions里主要调用了PlatformThread::Create来创建该线程,在creat方法里会去调一些跟平台相关的API来创建线程,直接上代码

图3
可以很清楚的看到在平台相关的类里都是跟windows相关的代码,这句话好像是句废话,想表达的意思就是google的代码写的还是很美的,可移植性之强可见一斑,学习了。调用windows的API CreatThread后就注册了回调函数ThreadFunc,该函数体如下

这个函数其实就是利用delegate的方法再调回到类Thread的ThreadMain的方法做跟平台无关的事情,哎呀,我还得说一句,人家代码写的确实好,到时候如果我想换一个平台直接把类PlatFormThread替换掉就可以了。再来看看ThreadMain做了什么事情吧
void Thread::ThreadMain() {
// The message loop for this thread.
MessageLoop message_loop(startup_data_->options.message_loop_type);
// Complete the initialization of our Thread object.
thread_id_ = PlatformThread::CurrentId();
PlatformThread::SetName(name_.c_str());
// ANNOTATE_THREAD_NAME(name_.c_str()); // Tell the name to race detector.
message_loop.set_thread_name(name_);
message_loop_ = &message_loop;
// Let the thread do extra initialization.
// Let's do this before signaling we are started.
Init();
startup_data_->event.Signal();
// startup_data_ can't be touched anymore since the starting thread is now
// unlocked.
Run(message_loop_);
// Let the thread do extra cleanup.
CleanUp();
// Assert that MessageLoop::Quit was called by ThreadQuitTask.
DCHECK(GetThreadWasQuitProperly());
// We can't receive messages anymore.
message_loop_ = NULL;
//thread_id_ = 0;
}
Thread::ThreadMain()
代码有点长就不截图了。先让我简单介绍一下message loop的概念(由于这个涉及到线程安全的问题,我打算下一次专门写点东西学习一下message loop),google采用的方式类似于微软的消息模式,你可以把message_loop_想象成一个队列,之前在介绍用这个线程封装类时,是通过函数message_loop()来post一些task到这个队列的,线程会不断到队列里去取task并执行,直到遇到一个exit task后退出,我想熟悉windows 消息模式的同学一定不会陌生。代码中的Run(message_loop_)就是开启了task 队列功能,不断去取task来完成任务。
初识chromium thread的实现的更多相关文章
- 9.C#知识点:线程初识及Thread初识(一)
知识点目录==========>传送门 线程和进程的简单概括. 1.进程就是"活动中"的程序,一个.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实 ...
- Chromium Graphics: Compositor Thread Architecture
Compositor Thread Architecture <jamesr, enne, vangelis, nduca> @chromium.org Goals The main re ...
- 长期更新系列:C#知识点
PS:写这个主要是基础差,写这么一个主要是为了自己查漏补缺,不会的搞会了.会了搞的更会.顺便整理知识. 目录 1.C#知识点:值类型和引用类型 2.C#知识点:I/0 3.C#知识点:is和as 4. ...
- 初识java线程(Thread)
<1>.概念问题 线程的状态:1.NEW : 没有start的线程 2.RUNNING :可运行线程,可能正在执行,也可能正在等待操作系统中的其他资源,比如cpu时间片 3.BlOCKED ...
- 初识CEF
介绍 CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开 ...
- 初识 MySQL 5.6 新功能、参数
摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...
- Debugging Chromium on Windows
转自:https://www.chromium.org/developers/how-tos/debugging-on-windows For Developers > How-Tos & ...
- Chromium Embedded Framework 中文文档(简介)
转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...
- [原][Android]All WebView methods must be called on the same thread.
问题 webView调用JS出错. class TestJS { ...... public TestJS(){ } ...
随机推荐
- 使用SqlBulkCopy批量插入多条数据进入表中
由于工作中项目需求结算一次生成一批相同批次号的数据插入一个表中,然后再通过另一页面展示出来,所以需要用到一次性插入一批数据,所以就采用了SqlBulkCopy插入一批数据 1 public stati ...
- struts2请求过程源码分析(转)
Struts2是Struts社区和WebWork社区的共同成果,我们甚至 可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品, ...
- javascript 事件流及应用
当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序发生该元素的触发 事件,事件传播的顺序叫做事件流 1.事件流的分类: A.冒泡型事件(所有浏览器都支持) 由明确的事件源到最不确定 ...
- Activity组件的UI实现
Activity组件的UI实现需要与WindowManagerService服务和SurfaceFlinger服务进行交互 1. Activity组件在启动完成后,会通过一个类型为Session的Bi ...
- java 各种排序算法
各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说 ...
- QQ空间的“神奇”图片
近几天好多朋友问我qq空间出现的神奇图片原理,最近比较烦,事情比较多,一直没理.加上我对PHP之类的语言也一知半解. 今天闲了看了一下QQ空间,发现这个很早以前就有人写过这样的帖子了 看别人解释 (转 ...
- pyes-elasticsearch的python客户端使用笔记
elasticsearch入门: http://www.qwolf.com/?p=1387 一.重要的概念 http://834945712.iteye.com/blog/1915432 这篇文章很 ...
- NotePad++更改背景颜色
白色的编辑框看得眼睛不舒服,怎么样更改NotePad++的背景颜色使眼睛更舒服些? 1.设置--语言格式设置 2.设置背景色 “背景色”一栏,选择背景色颜色 “使用全局背景色”一栏要打上√,否则无 ...
- 2、.net NVelocity中原生javascript ajax封装使用
在页面上,我们经常会遇到局部刷新的例子,这个时候,就需要用到ajax, 因为很多代码都是公用的,所以我们想到了,将代码封装,简化了使用,减少了冗余 javascript ajax代码如下: var x ...
- ios开发之C语言第3天
变量的命名规则以及规范 变量的命名规则 1>变量名只能由任意的字母,下划线和$以及数字组成,注意不能用数字开头 2>区分大小写 3>变量一定要先定义再使用 4>同一个大括号中 ...