学习使用chromium里的线程类(1)
2015-07-02 16:31
681 查看
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;
}
运行结果如下:
![](https://img-blog.csdn.net/20150702184410664?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVqdWVkdW9sdW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们来看看PostTask参数的含义:
tracked_objects::Location 参数:是为了满足轻量级的调试用途(task计数、正等待的task以及已完成的task都可以通过Url about:objects被监测到,当然我们需要debug版本)。一般来说,FROM_HERE 宏是这个参数的适当的值。
base::Closure参数:实际是一个Callback对象,包含了一个Run函数,这个对象被 base::Bind()函数创建,处理一个task,message_loop最终会调用 base::Closure 的 Run 函数,然后会把task 对象的引用 drops
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参数的含义:
tracked_objects::Location 参数:是为了满足轻量级的调试用途(task计数、正等待的task以及已完成的task都可以通过Url about:objects被监测到,当然我们需要debug版本)。一般来说,FROM_HERE 宏是这个参数的适当的值。
base::Closure参数:实际是一个Callback对象,包含了一个Run函数,这个对象被 base::Bind()函数创建,处理一个task,message_loop最终会调用 base::Closure 的 Run 函数,然后会把task 对象的引用 drops
相关文章推荐
- java-模拟tomcat服务器
- 超过 77% 的桌面计算机运行基于 Chromium 的浏览器
- 微软发布令牌漏洞公告:可绕过 Chromium 沙盒执行任意代码
- 谷歌 Project Zero 团队宣布新政策,漏洞披露前将有完整的 90 天缓冲期
- Android使用Google Map浅谈
- 专家解读:开源软件项目是否会被限制出口?
- 专家解读:开源软件项目是否会被限制出口?
- Google排名算法改变 不在以外部链为主
- Google Adsense 支票托收信息收集 (1-30-2007)
- Google Adsense常用技巧总结
- Google推广的十二点技巧
- google优化圣经做网站必备第1/3页
- Google AdSense英文高价关键词排行列表
- Google 统计图表(Flash)小插件
- 2月份停止Google Adsense下线推介 将在中国地区停止投放
- 使用Google工具栏追踪 Blog 留言
- C#多线程之Thread中Thread.IsAlive属性用法分析
- Google官方支持的NodeJS访问API,提供后台登录授权
- jquery repeater 模仿 Google 展开页面预览子视图