博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C实现的延时队列设计
阅读量:4968 次
发布时间:2019-06-12

本文共 3661 字,大约阅读时间需要 12 分钟。

 仿的live555 C++的延时队列

 

#include <rtthread.h>

extern struct dqueue_ops dqops;

struct dqueue_entry
{
 rt_tick_t s_time;
 void *pframe;
 struct dqueue_entry *pnext;
};

struct dqueue_handle

{
 struct dqueue_entry priv;
 rt_uint8_t s_init;
 rt_uint8_t s_size;
 rt_tick_t s_last_sync_tick;
 //struct dqueue_entry *pfront;
 //struct dqueue_entry *prear;
 struct dqueue_ops *s_ops;
};

struct dqueue_ops

{
// void (*enqueue)(struct dqueue_handle*,struct dqueue_entry *);
// void (*enqueue_by_ptr)(struct dqueue_handle*,struct dqueue_entry *,struct dqueue_entry *);
 void (*enqueue_by_delay)(struct dqueue_handle* ,void *,rt_tick_t);
 void (*dequeue)(struct dqueue_handle* ,void (*task)(void *));
 void (*synchronize)(struct dqueue_handle*);
 //rt_uint8_t (*isempty)(struct dqueue_handle*); 

};

void dq_enqueue_by_delay(struct dqueue_handle* dq,void *p,rt_tick_t delta_time);

void dq_synchronize(struct dqueue_handle* dq);
void dq_dequeue(struct dqueue_handle* dq,void (*task)(void *));
struct dqueue_handle* dq_init(struct dqueue_ops* pops);
struct dqueue_entry* dq_head(struct dqueue_handle* dq);

 

 

/*****delta_queue.c*****/

/*file:delta_queue.c

* This file is part of A2dp.
*
*Change Logs:
*Date           Author       Notes
*2015-12-1      Raid     create
*2015-12-5      Raid   merge enqueue
*/

#include "delta_queue.h"

#include <rtthread.h>

#define NULL 0

#define INT_MAX 0x7FFFFFFF

struct dqueue_entry;

struct dqueue_handle;

struct dqueue_ops dqops =
{
  dq_enqueue_by_delay,
  dq_dequeue,
  dq_synchronize
};

 

struct dqueue_handle* dq_init(struct dqueue_ops* pops)

{
 struct dqueue_handle* dq
  = (struct dqueue_handle* )rt_malloc(sizeof(struct dqueue_handle));
 dq->s_init = 1;
 dq->s_size = 0;
 dq->priv.s_time = INT_MAX;
 dq->priv.pnext =  (struct dqueue_entry *)dq;
 dq->s_last_sync_tick = rt_tick_get();
 dq->s_ops = pops;
 return  dq;
}

rt_uint8_t dq_is_empty(struct dqueue_handle* dq)

  return dq->s_size==0;
}

void dq_enqueue_by_delay(struct dqueue_handle* dq,void *p,rt_tick_t delta_time)

{
 struct dqueue_entry* new_entry = NULL;
 struct dqueue_entry* index_entry;

 if (!dq->s_init)

  return ;
 new_entry = (struct dqueue_entry*)rt_malloc(sizeof(struct dqueue_entry));
 new_entry->pframe = p;
 index_entry = dq_head(dq);
 dq->s_size++;
 
 while(delta_time>=index_entry->pnext->s_time)
 {
  delta_time -= index_entry->pnext->s_time;
  index_entry = index_entry->pnext;
 }
 new_entry->s_time = delta_time;
 index_entry->pnext->s_time -= new_entry->s_time;

 new_entry->pnext = index_entry->pnext;

 index_entry->pnext = new_entry; 
 return  ;
}

struct dqueue_entry* dq_head(struct dqueue_handle* dq)

{
 return &dq->priv;
}

/*******************ops func******************************/
void dq_synchronize(struct dqueue_handle* dq)
{
 rt_tick_t time_now  = rt_tick_get();
 rt_tick_t time_since_lastsync = 0;
 struct dqueue_entry *current_entry = dq->priv.pnext;
 if (time_now<dq->s_last_sync_tick)
 {
  //the system clock  has apparently gone back in time
  dq->s_last_sync_tick = time_now;
  return ;
 }
 time_since_lastsync = time_now - dq->s_last_sync_tick  ;
 dq->s_last_sync_tick = time_now;

 while(time_since_lastsync>current_entry->s_time)

 {
  time_since_lastsync -= current_entry->s_time;
  current_entry->s_time = 0; //must do without delay
  current_entry = current_entry->pnext; 
 }
 current_entry ->s_time -= time_since_lastsync;
}

void dq_dequeue(struct dqueue_handle* dq,void (*taskfunc)() )
{
 struct dqueue_entry *current_entry = dq->priv.pnext;
 struct dqueue_entry *temp_entry = NULL;
 if(!dq_is_empty(dq))        
 {
  while(current_entry->s_time==0)
  {
   taskfunc(current_entry->pframe);
   temp_entry = current_entry;
   current_entry = current_entry->pnext;
   rt_free(temp_entry);
   dq->priv.pnext =  current_entry;

   dq->s_size--;

  }
 }
}

转载于:https://www.cnblogs.com/HowToRaid/p/5080619.html

你可能感兴趣的文章
vue本地项目设置通过手机访问
查看>>
NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
查看>>
网络游戏的基本数据埋点和数据统计---2016/7/25
查看>>
Java从零开始学四十五(Socket编程基础)
查看>>
React中的setState到底发生了什么?
查看>>
java操作Excel文件
查看>>
Java科普之加密算法
查看>>
php 23种设计模型 - 工厂模式
查看>>
Linux Valgrind命令
查看>>
Linux 控制台/终端/tty/shell
查看>>
正则表达
查看>>
bigpipe nodejs
查看>>
MVC之前的那点事儿系列(3):HttpRuntime详解分析(下)
查看>>
nginx+tomcat负载均衡
查看>>
使用云负载时将http的请求转发至https时报错:“ERR_TOO_MANY_REDIRECTS”!
查看>>
dsm 黑 离线转码 备忘
查看>>
3.13 以类取代类型码
查看>>
linux安装sz && rz功能
查看>>
关于Hive正则技术处理比较规范的日志数据
查看>>
初学C语言
查看>>