您的位置:首页 > 运维架构

live555 env->taskScheduler().doEventLoop()解析/自己实现

2014-08-06 19:56 681 查看
从live555的例程testOnDemandRTSPServer可知/article/1980193.html

live555靠函数 env->taskScheduler().doEventLoop();/执行循环方法,来执行循环方法,对套接字的读取事件和对媒体文件的延时发送操作都在这个循环中完成。

源代码如下:

void BasicTaskScheduler0::doEventLoop(char* watchVariable) {
  // Repeatedly loop, handling readble sockets and timed events:
  while (1) {
    if (watchVariable != NULL && *watchVariable != 0) break;
    SingleStep();
  }
}
里面是个死循环,如果想在程序中添加个循环或者在循环中执行其他的代码,就没法调用此函数了,为了解决这个问题,特意分析了下关于TaskScheduler任务调度这部分的源代码



主要的三个类:BasicTaskScheduler继承BasicTaskScheduler0继承TaskScheduler

1.TaskScheduler:创建的纯虚函数 virtual
void doEventLoop(char* watchVariable = NULL) = 0;


所以为抽象类,不可创建对象


文件:UsageEnvironment.hh中创建;UsageEnvironment.cpp添加函数实体

2.BasicTaskScheduler0继承TaskScheduler:创建的纯虚函数virtual
void SingleStep(unsigned maxDelayTime = 0) = 0;


虽然BasicTaskScheduler0.cpp中实现了doEventLoop的实体,但是又新增了纯虚函数


所以为抽象类,不可创建对象

文件:BasicUsageEnvironment0.hh中创建类("includeUsageEnvironment.hh");BasicUsageEnvironment0.cpp添加函数实体


BasicTaskScheduler.cpp中添加TASK部分的函数实体(include BasicUsageEnvironment0.hh)

3.BasicTaskScheduler继承BasicTaskScheduler0:BasicTaskScheduler.cpp中实现了SingleStep的实体


派生类中完全实现基类的纯虚函数,非抽象类,可以创建对象

文件:BasicUsageEnvironment.hh中创建类("include UsageEnvironment0.hh");BasicUsageEnvironment.cpp添加函数实体

BasicTaskScheduler.cpp中添加TASK部分的函数实体(include BasicUsageEnvironment.hh)

由env->taskScheduler().doEventLoop();语句可知

UsageEnvironment*
env;

class
UsageEnvironment {

public:

void reclaim();

// task scheduler:

TaskScheduler& taskScheduler() const {return fScheduler;}

UsageEnvironment类的一部分

env->taskScheduler()相当于创建了TaskScheduler的实例

env->taskScheduler().doEventLoop();调用doEventLoop()函数,此语句相当于下面两条语句

TaskScheduler*
scheduler = BasicTaskScheduler::createNew();

scheduler->doEventLoop();

由doEventLoop()函数内容知,就调用了一个SingleStep();函数

从调用doEventLoop()函数的过程知,调用SingleStep();函数需要创建BasicTaskScheduler0实例(因为在此类中创建的纯虚函数doEventLoop)

然后调用doEventLoop(),但是BasicTaskScheduler0又不能创建对象,所以就利用BasicTaskScheduler创建实例,但是返回值用BasicTaskScheduler0

但是由例程testOnDemandRTSPServer知创建服务器的过程中需要TaskScheduler*
scheduler = BasicTaskScheduler::createNew();

并且doEventLoop()也是与此语句有联系的,不能创建两个 BasicTaskScheduler::createNew();

用以下方法:

BasicTaskScheduler0*
Basicscheduler = BasicTaskScheduler::createNew();

TaskScheduler*
scheduler;

scheduler = Basicscheduler;

这样既有了TaskScheduler*
scheduler;又有了BasicTaskScheduler0* Basicscheduler

这样就可以创建自己的类和doEventLoop()了

class
zjk

{

public:

zjk();

void doEventLoopzjk(BasicTaskScheduler0* Basicscheduler);

};

void zjk::doEventLoopzjk(BasicTaskScheduler0* Basicscheduler)

{ // Repeatedly loop, handling readble sockets and timed events:

while (1) {

//printf("zjk\n");

Basicscheduler->SingleStep();

//ADD Sth else

}

}

zjk
*z;

z->doEventLoopzjk(Basicscheduler);

上两条语句就相当于env->taskScheduler().doEventLoop();了

但是你可以在void
zjk::doEventLoopzjk(BasicTaskScheduler0* Basicscheduler) 中添加需要插入到循环中的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐