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

从live555的例程testOnDemandRTSPServer可知http://blog.csdn.net/zhangjikuan/article/details/38349635

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) 中添加需要插入到循环中的代码

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一段 C++ 代码,其中包含了一些条件语句和函数调用。逐行解释如下: ```if ( m_env->m_ClearSendQueFlag )``` 如果 `m_env->m_ClearSendQueFlag` 变量为真(非零),则执行下面的代码块。 ```m_asduSendQue.ClearAllDataBuff();``` 调用 `m_asduSendQue` 对象的 `ClearAllDataBuff()` 函数,清空发送队列的所有数据缓冲区。 ```memset(m_sendBuf,0,MaxLen_Buf);``` 使用 `memset()` 函数将 `m_sendBuf` 数组的所有元素都设置为 0,该数组的长度为 `MaxLen_Buf`。 ```this->m_env->m_TxBuf.ResetBuf();``` 调用 `m_env` 对象的 `m_TxBuf` 成员的 `ResetBuf()` 函数,重置该成员对象的缓冲区。 ```m_Flag |= IEC104_FLAG_STARTDT;``` 将 `m_Flag` 变量的二进制表示中的第 0 位(从右往左数)设置为 1,表示启动传输(STARTDT)。 ```OutputLogMsgToLogFile("var/log/s104.log",320000,"%s:%d INFO! STARTDT! 104startdtresrt=%d ClearSendQueFlag=%d RtuNo=%d\n",__FILE__,__LINE__,m_env->m_104startdtresrt,m_env->m_ClearSendQueFlag,m_env->m_sRtuNo);``` 调用 `OutputLogMsgToLogFile()` 函数,将日志信息记录到文件中。该函数的第一个参数是文件名,第二个参数是日志文件的最大大小,第三个参数是日志信息的格式化字符串,后面的参数是对应的参数值。 ```this->m_dataTransflag = 0x01;``` 将 `m_dataTransflag` 变量的值设置为 1,表示数据传输。 ```this->m_env->m_appLayer->StartDTProcess();``` 调用 `m_env` 对象的 `m_appLayer` 成员的 `StartDTProcess()` 函数,启动应用层的 STARTDT 过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值