# scheduleDelayedTask **Repository Path**: houwentaoff/scheduleDelayedTask ## Basic Information - **Project Name**: scheduleDelayedTask - **Description**: 以系统时间为标准线的延迟任务调度线程 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-18 - **Last Updated**: 2021-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README scheduleDelayedTask =================== # 以系统时间为标准线的延迟任务调度线程 ## 说明: 参考live555中延时调度实现的C语言方式,用于onvif协议中的设置网络和event相关事件延迟设置.onvif中为何要延迟,因 为其网络设置需要在当前交互返回后才能进行,若提前修改后,当前交互则断开不能完成. ## 使用方法: 见main.c中的使用例子. ## 特性: * 利用gettimeofday获取系时间,进行ms级别上的延时任务. ## 实现原理: 1. 延迟队列,同步(synchronize)时间点作为队列的更新时间戳. 2. 派生的队列节点,队列节点,队列由AlarmHandler DelayQueueEntry DelayQueue 表示. 3. 轮训队列检查距离当前时间最短的对头节点的剩余间隔时间.其中为0(即是时间到了的节点)的节点执自定 义delay_fun.并执行完毕删除该节点. ## 与众不同的地方: ### 个人觉得 1. 派生的队列节点AlarmHandler是设计的独到之处,队列节点像一个容器,除开头节点以外里面放的都是AlarmHandler 派生节点,该派生节点含有延迟函数和参数的地址,是处理的关键. 2. 同步(synchronize)机制也设的很好. 3. 调度的时间如代码中所示:建议设置为30ms,在外等待队列中的数据执行完的时间周期建议设置为30ms的整数倍(我这设置为300ms).(设置的太小会导致cpu太高)