学习使用chromium里的线程类(1)

          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参数的含义:

tracked_objects::Location 参数:是为了满足轻量级的调试用途(task计数、正等待的task以及已完成的task 都可以通过 Url  aboutobjects被监测到,当然我们需要 debug 版本)。一般来说,FROM_HERE  宏是这个参数的适当的值。
base::Closure参数:实际是一个Callback 对象,包含了一个 Run 函数,这个对象被  base::Bind() 函数创建,处理一个 task message_loop 最终会调用  base::Closure  的  Run  函数,然后会把 task  对象的引用  drops 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值