Chromium就好比是一个宝藏,里面有很多宝贝。其中我最喜欢的宝贝是base库和ipc(进程间通信) 。这两件宝贝在大型项目开发中会给我们带来极大的帮助。所以值得我们去花大功夫研究、学习的。在来到我现在所在的公司前,我对chromium的了解几乎没有,那时我常常认为chromium指的就是chrome浏览器,直到所在公司在开发中大量使用了chromium里的宝贝,我才开始了解它。所在公司编码风格也完全参照google的编码风格,可想而知,上面的主管对chromium是多么的推崇。闲话少说,直入正题。
chromium开源库里抽出来了base库下载地址:http://download.csdn.net/detail/jujueduoluo/8864601
在学习使用thread类时,我们先来回答几个问题,为什么非得使用chromium里的线程?用他们的线程有什么好处?第一个问题回答是:“我们并不需要一定要用chromium里的线程类,一样可以写出很好的多线程程序,但是要写好多线程,需要我们操很多心,比如死锁问题;chromium里的thread类很好的解决了多线程的问题,使用起来也非常的方便”。第二个问题回答是:“正如上个问题所回答的,chromium的thread类有效解决了多线程的操心问题,因此好处是我们不用去担心那些问题”。最后借用chromium里线程概述的话来结束这一段,“我们不鼓励使用阻塞和线程安全的对象,取而代之的是,对象都只存在在一个线程中,我们在线程间传递消息。
1)简单使用base::Thread线程类:
每条线程都有一个 MessageLoop (base/message_loop.h)来处理线程的消息,你可以获取每个线程的MessageLoop,用这个函数就行 Thread.message_loop() 。线程间是通过抛任务的方式来通信。先把线程简单的封装下。
class SimpleThread : public base::Thread {
public:
explicit SimpleThread(const char* name) : base::Thread(name) {
}
virtual ~SimpleThread() {
}
void PostTask(
const tracked_objects::Location& from_here,
const base::Closure& task) {
message_loop()->PostTask(from_here, task);
}
void PostDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task, int64 delay_ms) {
message_loop()->PostDelayedTask(from_here, task, delay_ms);
}
};
需要包含的头文件有:
#include <iostream>
#include <tchar.h>
#include "base/threading/thread.h"
#include "base/memory/scoped_ptr.h"
#include "base/bind.h"
注:在使用chromium里的base库时需要事先把base库配置好。
然后我们利用这个简单的线程类来创建一个子线程,线程名叫“简单线程”,代码如下
void Thread_Task1() {
while (1) {
cout << "Thread_Task1线程\n";
::Sleep(1000);
}
}
int main(int argc, TCHAR * argv[]) {
scoped_ptr<SimpleThread> thread1(new SimpleThread("线程1"));
thread1->Start();
thread1->PostTask(FROM_HERE, base::Bind(&Thread_Task1));
while (1) {
cout << "Main线程\n";
::Sleep(1000);
}
return 0;
}
运行结果如下:
我们来看看PostTask参数的含义: