您的位置:首页 > 其它

3.live555源码分析----延时队列

2016-05-10 19:20 253 查看
live555本身是一个单进程、单线程的服务器,但是它能够完美的让多个客户端同时连接,除了使用select并发编程以外,延时队列是很重要的手段。

当连接一个客户端,进行视频帧传输的时候,是不能持续进行传输的,因为如果持续传输的话会占满整个线程,这样的话新的客户端便无法进行连接了,所以当传送一帧视频流的最后并不会马上再传送下一帧,而是调用scheduleDelayedTask()函数将传送下一帧的工作加入到延时队列里。这个步骤在函数sendPacketIfNecessary()中进行。下面是scheduleDelayedTask()函数的代码:

TaskToken BasicTaskScheduler0::scheduleDelayedTask(int64_t microseconds,
TaskFunc* proc,
void* clientData) {
if (microseconds < 0) microseconds = 0;
DelayInterval timeToDelay((long)(microseconds/1000000), (long)(microseconds%1000000));
AlarmHandler* alarmHandler = new AlarmHandler(proc, clientData, timeToDelay);
fDelayQueue.addEntry(alarmHandler);

return (void*)(alarmHandler->token());
}


加入到延时队列之后,需要时刻主动去延时队列查询有没有超时的任务,这个调用操作在SingleStep()函数中完成,SingleStep()最后有如下代码:

// Also handle any delayed event that may have come due.
fDelayQueue.handleAlarm();


就是在这个调用更新延时队列,然后查询有没有超时的任务进行执行。主要调用的函数有removeEntry()(删除延时队列中的节点),synchronize()(同步队列中节点的剩余时间),handleTimeout()(执行超时节点的任务)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: