此文主要記錄IPC項目中如何運用循環(huán)隊列來處理多則消息的,網(wǎng)絡攝像頭下文簡稱IPC。
在項目中,經(jīng)常會有網(wǎng)絡消息處理。現(xiàn)在的安防攝像頭很多,通常也會配套一個APP去控制IPC,比如設置移動檢測、人臉識別、嬰兒哭識別等等。在APP點擊一個button,可能會觸發(fā)APP通過網(wǎng)絡發(fā)送幾則消息給攝像頭。
這個時候,IPC需要處理這幾則或者十幾則消息。如果,IPC處理消息不是并發(fā)的,那么就需要不斷接收,不斷處理。這時候,運用隊列的機制,可以讓先接收到的消息先處理。
而后接收的消息則等待,典型的先進先出原則。如果IPC處理消息是并發(fā)的,同樣也可以運用隊列的機制,只不過需要在每次訪問隊列的時候加上鎖機制來同步資源。
IPC接收到的消息可能會包含APP用戶ID、請求的命令、消息的長度等。
那如何處理這些消息呢?大致思路如下:
我們可以把每一則消息帶有的信息放到結構體里面。這樣,每個結構體就是隊列的一個成員。接收消息的線程把消息包裝成一個結構體然后在隊列(數(shù)組)的尾部加上,處理消息的線程取出隊列的頭部來解析處理,每次解析處理完一則消息,就把消息從隊列的頭部移除。
所以,我們要定義一個結構體數(shù)組,結構體里面還能包含結構體等,只要項目需要,都可以拓展。
程序模板比較簡單,關鍵是知道怎么運用到項目中。
其中需要注意的點是循環(huán)隊列如何判斷空還是滿。假設循環(huán)隊列長度為5,當頭指針和尾指針指向同一個地方,我們設為空。當有元素入隊,尾指針指向下一個元素,當有元素出隊,頭指針指向下一個元素。當指向的元素為5時,下一個元素為0。
這樣,得出的結論是,當隊列為滿時,頭指針和尾指針是相等的,這和隊列為空的時候是一樣的。不信,畫畫圖看看。
那怎么處理呢?
為了區(qū)別空隊列和滿隊列,數(shù)組多加一個元素,這個元素是不確定的,是可以移動的,它將保證當隊列為滿時,還空留了一個位置。說起來比較抽象,看以下代碼:
上面的函數(shù)是判斷隊列是否為滿。這樣和隊列是否為空的判斷方法不一樣:
所以,通過在循環(huán)數(shù)組中加多了一個元素,就能夠區(qū)分隊列是空的還是滿的。
大致的模板如下:
#include#include //構造不完全填滿循環(huán)數(shù)組,以便區(qū)分隊列為空還是滿。 #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];//定義結構體數(shù)組 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; }
測試結果如下:
審核編輯:湯梓紅
-
攝像頭
+關注
關注
60文章
4862瀏覽量
96307 -
網(wǎng)絡
+關注
關注
14文章
7599瀏覽量
89250 -
指針
+關注
關注
1文章
481瀏覽量
70610 -
IPC
+關注
關注
3文章
352瀏覽量
52071 -
隊列
+關注
關注
1文章
46瀏覽量
10927
原文標題:循環(huán)隊列在網(wǎng)絡攝像頭項目中,處理多則消息的運用
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論