初识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(){ } ...
随机推荐
- Python3 基础
Hello world 在文本编辑器中,键入python执行代码,保存文件为hello.py print('hello, world') 注意print前面不要有任何空格.然后,选择一个目录,例如C: ...
- 浅谈页面无刷新技术ajax
现在一般网站都是用ajax来实现页面无刷新操作的. 什么是无刷新:ajax可以实现页面与后台的数据交互,用户完全感觉不出页面有任何的刷新,这就是AJAX的无刷新. ajax方法实现: 可以对ajax进 ...
- 如何在Html的div+css中去除<li>标签前面小黑点,和ul、LI部分属性方法
div是很多人做网站都会用到的,但在显示效果时前面总是会有一个小黑点,这个效果很多人不想要,但又不知到如何去除,然而我们可以用以下方法来清除. 1.在CSS中写入代码.找到相关性的CSS,在..li和 ...
- HTML5学习笔记----html5与传统html区别
一. HTML5语法的改变 该知识点所说变化指的是基于HTML4基础上所定义的改变,主要有如下: HTML5的文件扩展符(.html或.htm)与内容类型(text/html)保持不变. HTML5中 ...
- jquery完善的处理机制
使用jQuery选择器不仅比使用传统的getElementById()和getElementsByTagName()函数简洁得多,而且还能避免某些错误.请看下面例子: <script> d ...
- 移动web经验积累
1.从最小宽度时候开发,调试到iphone4来开发 2.宽度百分比,高度由具体内容决定, 3.文字需要设置最大高度,溢出隐藏 white-space: nowrap; text-overflow: e ...
- css动画怎么写:3个属性实现
3个属性:transition,animation,transform 实现步骤: 1.css定位 2.rgba设置颜色透明度 3.转换+动画 transform+animation 4.动画平滑过渡 ...
- DOM Ready 详解
DOM Ready 概述 熟悉jQuery的人, 都知道DomReady事件. window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致wind ...
- osg学习笔记3 简单几何模型
osg::Geode (geometry node) osg::Geode类表示场景中的渲染几何叶节点,它包含了渲染用的几何信息,没有子节点. 要绘制的几何数据保存在osg::Geode管理的一组os ...
- We7在政府门户中的应用
政府门户从传统的信息引导发展到现阶段的服务型门户,不论从角度转变上还是从平台选型上都跟以前有很大的不同,其更注重的是安全.扩展.易用和移动互联网几部分(当然这儿的注重是建立在已有政府门户电子政务三个板 ...