Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156742
  • 博文数量: 53
  • 博客积分: 2059
  • 博客等级: 大尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-14 20:25
文章分类
文章存档

2012年(1)

2011年(25)

2010年(16)

2009年(11)

我的朋友

分类: LINUX

2011-04-16 22:51:25

1.       前言

Darwin Streaming ServerApple公司提供的开源实时流媒体播放服务器程序。整个程序使用C++编写,在设计上遵循高性能,简单,模块化等程序设计原则,务求做到程序高效,可扩充性好。

本文简述了程序的整个结构,目的是为了以后阅读及修改程序的方便。

 

解开程序,程序的主要目录结构及作用如下

APIModules/                         模块程序的目录

APIStubLib/                          程序公共接口类目录

CommonUtilitiesLib/       通用库

Server.tproj/                          主程序目录

QTFileLib/                            mov, MP4文件读写库

RTSPClientLib/                     RTSP客户端协议库

RTCPUtilitiesLib/                   RTCP协议库

PlaylistBroadcaster.tproj/    MP4播放列表广播器

 

2.       重要基类结构

每个C++程序总有自己的基本类库结构,这种结构一般是程序的工具类,及基本接口类。

Darwin Streaming ServerCommonUtilitiesLib目录下是放着程序的基本类库结构

主要重要的是:

Task类,TaskThread类,TaskThreadPool:这三个类封装了线程库。三个类相互作用,通过Friend Class,使表现在外端的只有Task类,在这里,我们可以这样看:Task就是CPU使用片断,TaskThreadPoolCPU管理程序,TaskThread就是CPU。这样就使我们只需关心Task类就可,至于怎么调度,这是TaskThreadTaskThreadPool的事了。

下面我们来看这三个类是怎么互相作用从而形成一个整体的。

 

a. Virtual TaskThread::Entry():这个函数是整个线程函数的第一个执行函数,线程入口函数是TaskThread 从父类继承过来的Static OSThread::_Entry(),这个静态函数的唯一作用是执行Entry这个函数,这时的this指针是传进来的参数。这样就实现了线程的类封装。TaskThread::Entry()函数是一个循环,它不停的调用本身的WaitForTask函数,从自己内部的Queue中取得要运行的Task类指针。然后运行其中的Task:::Run()函数。

 

b. Virtual TaskThread::WaitForTask() 这个函数负责不停的从内部的队列中取到Task才返回。

 

c. static TaskThread  **TaskThreadPool:: sTaskThreadArray. 这个变量是一个很重要的变量,通过它,我们就能在线程外与线程内通信,(要知道TaskThread的指针在线程类就是this指针,在线程外就是sTaskThreadArray的里面放的值。这样的话,我们就可以通过这个指针(或者说死了,也就是这个队列)来进行通讯。

 

阅读(1145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~