live555 env->taskScheduler().doEventLoop()解析/自己实现
2014-08-06 19:56
681 查看
从live555的例程testOnDemandRTSPServer可知/article/1980193.html
live555靠函数 env->taskScheduler().doEventLoop();/执行循环方法,来执行循环方法,对套接字的读取事件和对媒体文件的延时发送操作都在这个循环中完成。
源代码如下:
主要的三个类: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) 中添加需要插入到循环中的代码
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) 中添加需要插入到循环中的代码
相关文章推荐
- <自己动手写操作系统>第三章——pmtest3源码解析:使用LDT
- java二维码生成与解析代码实现 <转载自http://blog.csdn.net/about58238/article/details/7494704>
- Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压
- 问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。 答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。 java 代码 1.
- Spring AOP的实现原理之<aop:aspectj-autoproxy />的解析
- Android 自己定义ViewGroup 实战篇 -> 实现FlowLayout
- Spring AOP的实现原理之<aop:aspectj-autoproxy />的解析
- 自己动手,实现一种类似List<T>的数据结构(二)
- 注册表--->使自己的程序实现开机启动
- Android 打造自己的个性化应用(四):仿墨迹天气实现-->自定义扩展名的zip格式的皮肤
- github项目解析(九)-->实现activity跳转动画的五种方式
- 解析spring MVC3 <mvc:annotation-driven> 实现
- Android 打造自己的个性化应用(四):仿墨迹天气实现-->自定义扩展名的zip格式的皮肤
- <自己动手写操作系统>第三章pmtest7源码解析——检测系统内存
- <二>---RIL层代码分析---RIL_startEventLoop()->eventLoop()->ril_event_loop()
- github项目解析(六)-->自定义实现ButterKnife框架
- <仅是自己做笔记。。。系列15>实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3这些都要找出来
- Control Study -> 键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载)
- 如何用Java实现Web服务器(转-->)
- kshen转Struts+Hibernate模式: jsp->servlet->session bean->DAO->Hibernate->Database 各层面的功能及其实现