那曲檬骨新材料有限公司

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 攝像頭
    +關注

    關注

    60

    文章

    4862

    瀏覽量

    96308
  • 網絡
    +關注

    關注

    14

    文章

    7599

    瀏覽量

    89251
  • 指針
    +關注

    關注

    1

    文章

    481

    瀏覽量

    70610
  • IPC
    IPC
    +關注

    關注

    3

    文章

    352

    瀏覽量

    52071
  • 隊列
    +關注

    關注

    1

    文章

    46

    瀏覽量

    10927

原文標題:循環隊列在網絡攝像頭項目中,處理多則消息的運用

文章出處:【微信號: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

    怎么使用CX3進行USB 3網絡攝像頭的開發?

    你好!我使用CX3進行USB 3網絡攝像頭的開發。在項目中,需要同時觸發靜態圖像捕獲。-通過PC(窗口7或8)應用軟件SW。相機快照按鈕。SW觸發已經完成,但HW觸發無法找到。作為Iassume
    發表于 09-20 14:15

    開發一套基于人檢測AI的網絡攝像頭

    人則將圖片數據自動上傳網絡并報警。硬件部分ART-PI開發版,OV2640攝像頭,紅外接收頭與遙控器軟件部分RT-THREAD操作系統,圖像處理,AI模型的C語言應用,紅外遙控部分,網絡
    發表于 02-16 07:26

    IP網絡攝像頭解決方案

    IP網絡攝像頭解決方案 視頻監控領域正向 IP 網絡進行技術過渡。可將 IP 網絡攝像系統定義為網絡
    發表于 07-29 08:41 ?4168次閱讀
    IP<b class='flag-5'>網絡</b><b class='flag-5'>攝像頭</b>解決方案

    利用C++提供的隊列封裝一個消息隊列

    最近的C++項目中,需要用到消息隊列,但是C++中又沒有原生的消息隊列,就在網上找了一下相關資料,利用C++提供的隊列,自己封裝一個消息
    的頭像 發表于 05-20 15:16 ?1974次閱讀
    利用C++提供的<b class='flag-5'>隊列</b>封裝一個消息<b class='flag-5'>隊列</b>

    展頻IC在攝像頭上的運用

    展頻IC在攝像頭上的運用
    發表于 04-14 10:12 ?1次下載
    百家乐官网游戏制作| 大发888官网网址| 百家乐赌场代理荐| 百家乐技术辅助软件| 百家乐赌场方法| 百家乐套路| 百家乐怎样玩的| 百家乐黏土筹码| 大发888信用好不好| 大发888官网注册送58| 香港六合彩直播| 北海市| 真博线上娱乐| 雅安市| 百家乐官网必胜法hk| 百家乐官网桌小| 九州百家乐官网的玩法技巧和规则| 百家乐官网b28博你发v| 宝龙百家乐娱乐城| 上市百家乐.评论| 大发888娱乐城下栽| 百家乐压钱技巧| 百家乐只打一种牌型| 华硕百家乐的玩法技巧和规则| 大发888官方 df888| 皇冠网上投注| 百家乐官网梅花图标| 真人百家乐官网送钱| 百家乐高手长胜攻略| 威尼斯人娱乐网代理| 哈巴河县| 百家乐官网布| 真人百家乐免费开户送钱| 威尼斯人娱乐城上不了| 名人线上娱乐城| 七胜百家乐官网娱乐平台| 百家乐赢足球博彩皇冠| 威尼斯人娱乐城打造| 百家乐代理| 破战百家乐官网的玩法技巧和规则| 申请百家乐会员送彩金|