live555学习笔记4-计划任务(TaskScheduler)深入探讨
来源:互联网 发布:数据流程图例题与答案 编辑:程序博客网 时间:2024/05/16 01:41
我们且把三种任务命名为:socket handler,event handler,delay task。
这三种任务的特点是,前两个加入执行队列后会一直存在,而delay task在执行完一次后会立即弃掉。socket handler保存在队列BasicTaskScheduler0::HandlerSet* fHandlers中;
event handler保存在数组BasicTaskScheduler0::TaskFunc * fTriggeredEventHandlers[MAX_NUM_EVENT_TRIGGERS]中;
delay task保存在队列BasicTaskScheduler0::DelayQueue fDelayQueue中。
下面看一下三种任务的执行函数的定义:
socket handler为
typedef void BackgroundHandlerProc(void* clientData, int mask);
event handler为
typedef void TaskFunc(void* clientData);
delay task 为
typedef void TaskFunc(void* clientData);//跟event handler一样。
再看一下向任务调度对象添加三种任务的函数的样子:
delay task为:
void setBackgroundHandling(int socketNum, int conditionSet ,BackgroundHandlerProc* handlerProc, void* clientData)
event handler为:
EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc)
delay task为:
TaskToken scheduleDelayedTask(int64_t microseconds, TaskFunc* proc,void* clientData)
socket handler添加时为什么需要那些参数呢?socketNum是需要的,因为要select socket(socketNum即是socket()返回的那个socket对象)。conditionSet也是需要的,它用于表明socket在select时查看哪种装态,是可读?可写?还是出错?proc和clientData这两个参数就不必说了(真有不明白的吗?)。再看BackgroundHandlerProc的参数,socketNum不必解释,mask是什么呢?它正是对应着conditionSet,但它表明的是select之后的结果,比如一个socket可能需要检查其读/写状态,而当前只能读,不能写,那么mask中就只有表明读的位被设置。
event handler是被存在数组中。数组大小固定,是32项,用EventTriggerId来表示数组中的项,EventTriggerId是一个32位整数,因为数组是32项,所以用EventTriggerId中的第n位置1表明对应数组中的第n项。成员变量fTriggersAwaitingHandling也是EventTriggerId类型,它里面置1的那些位对应了数组中所有需要处理的项。这样做节省了内存和计算,但降低了可读性,呵呵,而且也不够灵活,只能支持32项或64项,其它数量不被支持。以下是函数体
可以看到最多添加32个事件,且添加事件时没有传入clientData参数。这个参数在触发事件时传入,见以下函数:
看,clientData被传入了,这表明clientData在每次触发事件时是可以变的。
此时再回去看SingleStep()是不是更明了了?
delay task添加时,需要传入task延迟等待的微秒(百万分之一秒)数(第一个参数),这个弱智也可以理解吧?嘿嘿。分析一下介个函数:
有个问题,while循环中为什么没有判断是否到达最后一下的代码呢?难道肯定能找到大于新项的等待时间的项吗?是的!第一个加入项的等待时间是无穷大的,而且这一项永远存在于队列中。
- live555学习笔记4-计划任务(TaskScheduler)深入探讨
- live555学习笔记4-计划任务(TaskScheduler)深入探讨
- live555学习笔记4-计划任务(TaskScheduler)深入探讨
- live555学习笔记4-计划任务(TaskScheduler)深入探讨
- live555-计划任务(TaskScheduler)深入探讨
- 计划任务(TaskScheduler)深入探讨
- live555 计划任务(TaskScheduler)
- live555峰哥的私房菜(二)-----计划任务(TaskScheduler)探讨
- live555学习笔记-UsageEnvironment和TaskScheduler
- live555源码学习笔记之TaskScheduler
- live555学习之基本类介绍及计划任务深度探讨
- live555学习之基本类介绍及计划任务深度探讨
- live555学习之基本类介绍及计划任务深度探讨
- 用TaskScheduler创建计划任务
- 深入Spark内核:任务调度(3)-TaskScheduler
- Linux 学习笔记---计划任务
- 计划任务crontab学习笔记
- live555任务调度学习
- iOS Reading from private effective user settings?
- openjudge 简单的整数划分问题
- Linux(Ubuntu)下MySQL数据库的安装
- 《机器学习实战》——logistic回归
- 如何恢复,迁移,添加, 删除 Voting Disks
- live555学习笔记4-计划任务(TaskScheduler)深入探讨
- Spark 大数据处理技术
- c# var
- 数据结构实验之栈:行编辑器 数组模拟栈
- ECharts-Java 开源项目寻求合作维护
- yum 安装apache
- IE8以下不支持H5新标签的解决方案
- live555学习笔记5-RTSP服务运作
- iOS command /usr/bin/codesign failed with exit code 1?