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


         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()(执行超时节点的任务)。

  • 相关阅读:
    python 发送邮件
    java 获取两个时间之前所有的日期
    java 子线程定时去更改主线程的变量
    post 两种方式 application/x-www-form-urlencoded和multipart/form-data
    aws 社交媒体技术大会 部分总结
    java操作Mongodb数据库
    实体类注解 @entity
    spring security 部分注解讲解
    @Column
    阿里云搭建服务器
  • 原文地址:https://www.cnblogs.com/dchipnau/p/5479126.html
Copyright © 2020-2023  润新知