0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32嵌入式开发 来源:CSDN-云英 2023-06-25 14:41 次阅读

此文主要记录IPC项目中如何运用循环队列来处理多则消息的,网络摄像头下文简称IPC。

在项目中,经常会有网络消息处理。现在的安防摄像头很多,通常也会配套一个APP去控制IPC,比如设置移动检测、人脸识别、婴儿哭识别等等。在APP点击一个button,可能会触发APP通过网络发送几则消息给摄像头。

这个时候,IPC需要处理这几则或者十几则消息。如果,IPC处理消息不是并发的,那么就需要不断接收,不断处理。这时候,运用队列的机制,可以让先接收到的消息先处理。

而后接收的消息则等待,典型的先进先出原则。如果IPC处理消息是并发的,同样也可以运用队列的机制,只不过需要在每次访问队列的时候加上锁机制来同步资源。

IPC接收到的消息可能会包含APP用户ID、请求的命令、消息的长度等。

那如何处理这些消息呢?大致思路如下:

我们可以把每一则消息带有的信息放到结构体里面。这样,每个结构体就是队列的一个成员。接收消息的线程把消息包装成一个结构体然后在队列(数组)的尾部加上,处理消息的线程取出队列的头部来解析处理,每次解析处理完一则消息,就把消息从队列的头部移除。

所以,我们要定义一个结构体数组,结构体里面还能包含结构体等,只要项目需要,都可以拓展。

程序模板比较简单,关键是知道怎么运用到项目中。

其中需要注意的点是循环队列如何判断空还是满。假设循环队列长度为5,当头指针和尾指针指向同一个地方,我们设为空。当有元素入队,尾指针指向下一个元素,当有元素出队,头指针指向下一个元素。当指向的元素为5时,下一个元素为0。

这样,得出的结论是,当队列为满时,头指针和尾指针是相等的,这和队列为空的时候是一样的。不信,画画图看看。

那怎么处理呢?

为了区别空队列和满队列,数组多加一个元素,这个元素是不确定的,是可以移动的,它将保证当队列为满时,还空留了一个位置。说起来比较抽象,看以下代码:

wKgZomSX4dGAO2wbAAAICr4CJzA278.png

上面的函数是判断队列是否为满。这样和队列是否为空的判断方法不一样:

wKgaomSX4dGAfHt6AAAG7mO7GRM444.png

所以,通过在循环数组中加多了一个元素,就能够区分队列是空的还是满的。

大致的模板如下:

#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  student


typedef 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;
}
测试结果如下:
3d2a3b16-11a5-11ee-962d-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 摄像头
    +关注

    关注

    59

    文章

    4608

    浏览量

    92895
  • 网络
    +关注

    关注

    14

    文章

    7251

    浏览量

    87441
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70361
  • IPC
    IPC
    +关注

    关注

    3

    文章

    306

    浏览量

    51348
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10849

原文标题:循环队列在网络摄像头项目中,处理多则消息的运用

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    低功耗无线摄像头项目合作

    现在有一个项目外包,低功耗无线摄像头,使用锂电池供电,需要支持BLE唤醒拍照,支持一年待机。 有经验的请联系我。
    发表于 01-18 19:01

    网络摄像头监控的系统优势

     网络摄像头除了能在世界的任何一个角落通过Internet进行远端监控之外,通过网络监控也可以有效地降低成本,它的"即插即用"功能,无须像模拟摄像机一样必须安装同轴电缆。只要利用
    发表于 03-25 15:26

    基于labview的摄像头帧录像机

    该示例使用一个生产者消费者结构。生产环路产生的网络摄像头图像和时间戳记,然后送入队列。由于数据从摄像头的图像,它是一个引用的内存位置,我需要确保在
    发表于 12-13 16:22

    LabVIEW获取网络摄像头方法

    一个改装过的无线路由器,通过刷机,将路由器中加载网络摄像头驱动,这样就可以将视频发布出去了,当然你的电脑必须有WIFI功能。建议新手直接购买成品,因为有些模块需要修改硬件电路,至于在哪购买,请自行淘宝
    发表于 04-14 23:36

    Labview队列计时和队列使用循环处理

    大家可以看看,Labview队列计时和队列使用循环处理
    发表于 05-16 09:59

    【OK210申请】简易摄像头监控系统

    ,之前用过一款,很喜欢。项目描述:项目就是做一个简易摄像头监控系统,其功能主要类似于小区摄像头监控的系统,在实现基本功能之后,希望能对小区的监控系统进行优化。更可以将其
    发表于 07-26 09:55

    【TL6748 DSP申请】指纹图像处理项目摄像头视频还原项目、音频算法研究项目

    申请理由:指纹图像处理项目摄像头视频还原项目、音频算法研究项目项目描述:指纹图像
    发表于 09-10 11:16

    关于Labview如何调用多个网络摄像头的经验(与之前小鹰的用IP camera adapter的方法不同)

    由于想用Labview调用wifi摄像头,但是IMDQdx又只认USB摄像头,于是在网上调研后发现小鹰说可以用IP camera adapter 来将网络
    发表于 01-11 15:32

    labview调用网络摄像头时崩溃

    首先,我可以调用笔记本自带的摄像头。我的网络摄像头使用网线与电脑连接(项目需要用网线),刚开始连上之后max不识别,后来网上查资料,说是要设置成本地
    发表于 03-12 15:14

    队列循环发送

    请问运用队列事件结构,如何实现点击一次按键循环发送呢
    发表于 10-17 11:00

    开发一套基于人检测AI的网络摄像头

    人则将图片数据自动上传网络并报警。硬件部分ART-PI开发版,OV2640摄像头,红外接收头与遥控器软件部分RT-THREAD操作系统,图像处理,AI模型的C语言应用,红外遥控部分,网络
    发表于 02-16 07:26

    使用张量流和Open CV来检测网络摄像头框架中的项目

    电子发烧友网站提供《使用张量流和Open CV来检测网络摄像头框架中的项目.zip》资料免费下载
    发表于 10-28 10:18 0次下载
    使用张量流和Open CV来检测<b class='flag-5'>网络</b><b class='flag-5'>摄像头</b>框架中的<b class='flag-5'>项目</b>

    利用C++提供的队列封装一个消息队列

    最近的C++项目中,需要用到消息队列,但是C++中又没有原生的消息队列,就在网上找了一下相关资料,利用C++提供的队列,自己封装一个消息
    的头像 发表于 05-20 15:16 1099次阅读
    利用C++提供的<b class='flag-5'>队列</b>封装一个消息<b class='flag-5'>队列</b>

    NVR与摄像头如何混搭使用

    关于摄像头与NVR混搭的问题,这个在实际项目中非常常见,今天我们就这方面的问题做个专题,了解清楚主流的摄像混搭添加的方法。
    的头像 发表于 09-25 10:07 1576次阅读
    NVR与<b class='flag-5'>摄像头</b>如何混搭使用

    展频IC在摄像头上的运用

    展频IC在摄像头上的运用
    发表于 04-14 10:12 1次下载