接触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的实现的更多相关文章

  1. 9.C#知识点:线程初识及Thread初识(一)

    知识点目录==========>传送门 线程和进程的简单概括. 1.进程就是"活动中"的程序,一个.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实 ...

  2. Chromium Graphics: Compositor Thread Architecture

    Compositor Thread Architecture <jamesr, enne, vangelis, nduca> @chromium.org Goals The main re ...

  3. 长期更新系列:C#知识点

    PS:写这个主要是基础差,写这么一个主要是为了自己查漏补缺,不会的搞会了.会了搞的更会.顺便整理知识. 目录 1.C#知识点:值类型和引用类型 2.C#知识点:I/0 3.C#知识点:is和as 4. ...

  4. 初识java线程(Thread)

    <1>.概念问题 线程的状态:1.NEW : 没有start的线程 2.RUNNING :可运行线程,可能正在执行,也可能正在等待操作系统中的其他资源,比如cpu时间片 3.BlOCKED ...

  5. 初识CEF

    介绍 CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开 ...

  6. 初识 MySQL 5.6 新功能、参数

    摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...

  7. Debugging Chromium on Windows

    转自:https://www.chromium.org/developers/how-tos/debugging-on-windows For Developers‎ > ‎How-Tos‎ & ...

  8. Chromium Embedded Framework 中文文档(简介)

    转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...

  9. [原][Android]All WebView methods must be called on the same thread.

    问题 webView调用JS出错. class TestJS {         ......         public TestJS(){         }                   ...

随机推荐

  1. 菜鸟的MySQL学习笔记(三)

    4-1插入记录INSERT INSERT [INTO] tbl_name [(col_name)] {VALUES|VALUE} ({expr|DEFAULT},...), (...), ...   ...

  2. erlang 里的if 和 case

    case Expression of Pattern1 [when Guard1] -> Expr_seq1; Pattern2 [when Guard2] -> Expr_seq2; … ...

  3. ubuntu logout 命令

    gnome-session-quit 点击打开链接http://askubuntu.com/questions/15795/how-can-you-log-out-via-the-terminal

  4. AMAZON PRICE TRACKER, AMAZON PRICE HISTORY, AMAZON PRICE DROP ALERT | DROPGG.COM

    DropGG.com is the destination for savvy shoppers looking to save money by buying smart. DropGG.com a ...

  5. facebook快速登录常见错误:后台设置、域名权限、开发模式、公开、沙盒

    开发人员登录地址 :  https://developers.facebook.com/?ref=pf 官方登录API文档地址 : https://developers.facebook.com/do ...

  6. 如何在版本控制工具中管理Sencha Architect的項目

    根據數次痛苦的經歷結合stack overflow上的解答,發現原來還是可以使用svn.git之類的版本控制工具管理Sencha Architect生成的項目的. 具體的要點如下,假定項目記作{PRO ...

  7. [python][flask][flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

    鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流. 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文 ...

  8. Python 学习笔记(1) - 开始

    找一个能看的教程(不用太过于纠结以至于耗费大量时间,很可能还没开始就放弃了. -- 这条要作为新的做事准则放入我的日常了,警惕一开始就追求完美常常会什么也得不到.) 我喜欢看书不爱视频,所以找了这个: ...

  9. SQL 多条件查询

    网上有不少人提出过类似的问题:“看到有人写了WHERE 1=1这样的SQL,到底是什么意思?”.其实使用这种用法的开发人员一般都是在使用动态组装的SQL.让我们想像如下的场景:用户要求提供一个灵活的查 ...

  10. html 5 中的 6位 十六进制颜色码 代表的意思

    人的眼睛看到的颜色有两种: ⒈ 一种是发光体发出的颜色,比如计算机显示器屏幕显示的颜色: ⒉ 另一种是物体本身不发光,而是反射的光产生 十六进制颜色码 的颜色,比如看报纸和杂志上的颜色. 我们又知道任 ...