经典队列存取

来源:互联网 发布:数据库模型图是什么 编辑:程序博客网 时间:2024/06/06 11:47
#define SNAP_QUEUE_MAX    5


typedef struct __snap_queue_ {
   HI_BOOL bHasLP;
   char    szLP[64];
   unsigned int uiSpeed;
   unsigned short usColor;
   unsigned char ucWay;
   unsigned int uiBrokenRuleType;
   unsigned int uiLPLeft;
   unsigned int uiLPTop;
   unsigned int uiLPRight;
   unsigned int uiLPBottom;
    
   unsigned char *p_YBuff;
   unsigned char *p_UVBuff;
   unsigned int   uiFrameID;
   unsigned int   uiWidth;
   unsigned int   uiSnapMS;//
   unsigned long  ulSnapTM;//
}strc_snap_queue;


strc_snap_queue m_SnapQueueArray[SNAP_QUEUE_MAX];
int m_iSnapQueueIn=0;
int m_iSnapQueueOut=0;

//从队列中取 数据
void *SH_snap_queue_thread(void *arg) {
    
    strc_snap_queue *p_que;
    int iTimes;

    m_iSnapQueueIn=0;
    m_iSnapQueueOut=0;
    
    iTimes = 0;
    while(1) {
        
     if (m_iSnapQueueIn == m_iSnapQueueOut) //队列没有数据,等待
         {
                usleep(10000);//10mS
                iTimes ++;
                if (iTimes > 500) {
                    iTimes = 0;
                    //printf("m_iSnapQueueIn=%d m_iSnapQueueOut=%d in %s\n", m_iSnapQueueIn , m_iSnapQueueOut, __FUNCTION__);
                }
                continue;
     }

       p_que = &m_SnapQueueArray[m_iSnapQueueOut];  

       m_fSnapFuncCallBackDoSnapDone(
            p_que->uiFrameID,
             p_que->p_YBuff,
                 p_que->p_UVBuff,
             p_que->uiWidth,
            p_que->bHasLP,
                  p_que->szLP,
            p_que->uiSpeed,
                  p_que->usColor,
                  p_que->ucWay,
            p_que->uiBrokenRuleType,
            p_que->uiLPLeft,
                  p_que->uiLPTop,
                  p_que->uiLPRight,
                  p_que->uiLPBottom,
              p_que->uiSnapMS,
              p_que->ulSnapTM
            );

          m_iSnapQueueOut = (m_iSnapQueueOut + 1) % SNAP_QUEUE_MAX; //m_iSnapQueueOut +1 , 注意%是求余, 1%5=1 ,2%5=2
     }
}

//向队列中存 数据

void CallBack_VirtCle_DoOsd(unsigned char bHasLP, char *p_cLPArray,
        unsigned int uiSpeed, unsigned short usColor, unsigned char ucWay,
        unsigned int uiBrokenRuleType,
        unsigned int uiLPLeft, unsigned int uiLPTop, unsigned int uiLPRight, unsigned int uiLPBottom,
        unsigned char *p_ucYData, unsigned char *p_ucUVDta, unsigned int uiWidth, unsigned int uiFrameID
        ) {

    int iSnapQueueIn;

    struct timeval tvSnap;    
    unsigned int   uiSnapMS;
    unsigned long  ulSnapTM;

    //记录抓拍时间
    gettimeofday(&tvSnap,0);
    uiSnapMS = tvSnap.tv_usec/1000;
    ulSnapTM = time(NULL);

    iSnapQueueIn = (m_iSnapQueueIn + 1) % SNAP_QUEUE_MAX;// m_iSnapQueueIn 的下一个位置
    
    if ( iSnapQueueIn == m_iSnapQueueOut) { //队列满了,存的快,取的慢
        printf("Err: Snap Queue is full m_iSnapQueueIn=%d m_iSnapQueueOut=%d in %s. \n", m_iSnapQueueIn , m_iSnapQueueOut, __FUNCTION__);
        SH_drvif_ReleaseFrame(uiFrameID);
        return;
    }
    //存 数据
    m_SnapQueueArray[m_iSnapQueueIn].p_YBuff = p_ucYData;
    m_SnapQueueArray[m_iSnapQueueIn].p_UVBuff = p_ucUVDta;
    m_SnapQueueArray[m_iSnapQueueIn].uiFrameID = uiFrameID;
    m_SnapQueueArray[m_iSnapQueueIn].uiWidth = uiWidth;

    m_SnapQueueArray[m_iSnapQueueIn].bHasLP = bHasLP;
    strcpy(m_SnapQueueArray[m_iSnapQueueIn].szLP, p_cLPArray);
    m_SnapQueueArray[m_iSnapQueueIn].uiSpeed = uiSpeed;
    m_SnapQueueArray[m_iSnapQueueIn].usColor = usColor;
    m_SnapQueueArray[m_iSnapQueueIn].ucWay = ucWay;
    m_SnapQueueArray[m_iSnapQueueIn].uiBrokenRuleType = uiBrokenRuleType;
    m_SnapQueueArray[m_iSnapQueueIn].uiLPLeft = uiLPLeft;
    m_SnapQueueArray[m_iSnapQueueIn].uiLPTop = uiLPTop;
    m_SnapQueueArray[m_iSnapQueueIn].uiLPRight = uiLPRight;
    m_SnapQueueArray[m_iSnapQueueIn].uiLPBottom = uiLPBottom;
    m_SnapQueueArray[m_iSnapQueueIn].uiSnapMS = uiSnapMS;
    m_SnapQueueArray[m_iSnapQueueIn].ulSnapTM = ulSnapTM;

    m_iSnapQueueIn = iSnapQueueIn;//m_iSnapQueueIn 向下移动一位,+1   ;iSnapQueueIn为m_iSnapQueueIn的下一个
}




0 0
原创粉丝点击