循环队列在网络摄像头项目中处理多则消息的运用

此文主要记录ipc项目中如何运用循环队列来处理多则消息的,网络摄像头下文简称ipc。
在项目中,经常会有网络消息处理。现在的安防摄像头很多,通常也会配套一个app去控制ipc,比如设置移动检测、人脸识别、婴儿哭识别等等。在app点击一个button,可能会触发app通过网络发送几则消息给摄像头。
这个时候,ipc需要处理这几则或者十几则消息。如果,ipc处理消息不是并发的,那么就需要不断接收,不断处理。这时候,运用队列的机制,可以让先接收到的消息先处理。
而后接收的消息则等待,典型的先进先出原则。如果ipc处理消息是并发的,同样也可以运用队列的机制,只不过需要在每次访问队列的时候加上锁机制来同步资源。
ipc接收到的消息可能会包含app用户id、请求的命令、消息的长度等。
那如何处理这些消息呢?大致思路如下:
我们可以把每一则消息带有的信息放到结构体里面。这样,每个结构体就是队列的一个成员。接收消息的线程把消息包装成一个结构体然后在队列(数组)的尾部加上,处理消息的线程取出队列的头部来解析处理,每次解析处理完一则消息,就把消息从队列的头部移除。
所以,我们要定义一个结构体数组,结构体里面还能包含结构体等,只要项目需要,都可以拓展。
程序模板比较简单,关键是知道怎么运用到项目中。
其中需要注意的点是循环队列如何判断空还是满。假设循环队列长度为5,当头指针和尾指针指向同一个地方,我们设为空。当有元素入队,尾指针指向下一个元素,当有元素出队,头指针指向下一个元素。当指向的元素为5时,下一个元素为0。
这样,得出的结论是,当队列为满时,头指针和尾指针是相等的,这和队列为空的时候是一样的。不信,画画图看看。
那怎么处理呢?
为了区别空队列和满队列,数组多加一个元素,这个元素是不确定的,是可以移动的,它将保证当队列为满时,还空留了一个位置。说起来比较抽象,看以下代码:
上面的函数是判断队列是否为满。这样和队列是否为空的判断方法不一样:
所以,通过在循环数组中加多了一个元素,就能够区分队列是空的还是满的。
大致的模板如下:
#include #include //构造不完全填满循环数组,以便区分队列为空还是满。#define queue_len 16#define arrar_size (queue_len + 1)typedef struct student{ int math; int english; char name[32];} student;#define queue_type studenttypedef enum bool_{ false = 0, true = 1,}bool;//static使全局变量只在本文件中使用 static student studenttable[arrar_size];//定义结构体数组static unsigned int front; //指向队头元素 static unsigned int tail; //指向队尾元素的下一个 bool isqueueempty(void){ return (front == tail);}bool isqueuefull(){ return ((tail + 1) % arrar_size == front);}bool queueinsert(queue_type value){ if(isqueuefull()) return false; studenttable[tail] = value; tail = (tail + 1) % arrar_size; return true;}bool queuedelete(){ if(isqueueempty()) return false; front = (front + 1) % arrar_size; return true;}//测试程序int main(int argc, char *argv[]){ student stu; stu.math = 99; stu.english = 98; char name[32]= xiaoming; memcpy(stu.name,name,sizeof(name)); queueinsert(stu); stu.math = 61; stu.english = 60; memset(name,0,sizeof(name)); sprintf(name,xiaohong,sizeof(name)); memcpy(stu.name,name,sizeof(name)); queueinsert(stu); printf(front = %d,tail = %d,name = %s,front,tail,studenttable[front].name); queuedelete(); printf(front = %d,tail = %d,name = %s,front,tail,studenttable[front].name); return 0;}    测试结果如下:  


微软鼠标走向人体工程学 带你赏析微软精准鼠标的ID设计
全球首款最轻的助行器,为行动不便的人士带来帮助
spring boot入门篇
农机蓄电池冬季如何防冻
国产AI芯片如何助力车路协同突破落地瓶颈?
循环队列在网络摄像头项目中处理多则消息的运用
Samsung Terrace推出一款智能电视,具有高端三星QLED电视所能提供的所有功能
我国工业互联网标识解析体系运行良好,已有3000多个企业接入
PL设计中MPSoC EMIO GPIO的应用
为什么您的企业业绩破亿之后就很难突破了?
i.MX6ULL|字符设备驱动流程深究
韩国正在接收40架F-35A战斗机
微雪电子M24LR-DISCOVERY开发板简介
具有快速瞬态响应的极低压差稳压电路
储能逆变器关键技术参数解读
格创东智出席《财富》中国500强峰会 助力企业实现高质量发展
如何在Microsoft Word中制作高质量的小册子
智慧电厂5G+蓝牙+GPS/北斗RTK人员定位系统解决方案
一体成型电感中的磁场是如何产生的?
借助Ansys Speos这款光机设计一体化的光学软件