色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

REventBus工作流程

jf_NsPBt3VS ? 來源:風火輪技術團隊 ? 2023-05-30 09:09 ? 次閱讀

REventBus背景

在實際的項目開發中,經常會遇到業務與業務,組件與組件,業務與組件之間的通信,舉個例子:當有煙霧傳感器檢測到煙霧超標時,需要打開排氣扇排氣,同時顯示煙霧濃度顯示到顯示器中,供管理人員檢視。處理這樣的邏輯有幾種策略。如下:

排氣扇任務和顯示器任務,不斷的查詢煙霧濃度,各自處理檢測煙霧濃度是否超標。

煙霧模塊提供注冊監聽接口,排氣扇任務和顯示器任務分別注冊監聽,當濃度超標時,告知監聽任務。

以上兩種策略都存在很大的問題,問題分析:

第一種策略,每一個任務都需要不斷檢查判斷,這會導致資源的浪費,而且代碼也會有很多重復的。

第二種策略,雖然解決了第一種策略的的問題,但是如果場景中存在不止一個傳感器時,那么所需要注冊的監聽接口將隨之增加。而且監聽接口是跟具體的業務綁定的。

綜上所述:為了能夠解決上面的問題,REventBus組件應運而生。開源鏈接:https://gitee.com/RiceChen0/revent_bus

REventBus工作流程圖解

Publisher使用publish發出ige一個事件,Subscriber在其回調函數中接收事件。bd4e0a5c-fe81-11ed-90ce-dac502259ad0.png

REventBus依賴組件

為了提供更好的組件化,風火輪科技 和《Rice嵌入式開發技術分享》公眾號聯合推出R組件集,REventbus組件就是R組件集的其中一員,組件與組件之后存在依賴關系.REventBus組件同樣依賴一些組件,如下:

RPlatform組件:平臺適配層,為了能讓R組件能夠在不同RTOSLinux中運行,針對不同平臺做的適配層。鏈接:https://gitee.com/RiceChen0/rplatform。

RThread_pool組件:一個跨平臺,易移植,接口簡單的線程池組件。鏈接:https://gitee.com/RiceChen0/rthread_pool。

REventBus的使用

REventBus整體包含5部分:Subscribe,Publish,Event,EventCb,Broker。

Subscribe --訂閱者訂閱自己需要監聽的事件接口。

Publish --發布者發布事件,它支持同步發送和異步發送。

Event --訂閱者監聽的事件,只有存在訂閱事件,才會有與之對應的發布事件。

EventCb --事件產生的回調接口,訂閱者注冊,發布者發布對應事件之后產生回調。

Broker --事件代理,管理事件注冊,注銷,監聽。

REventBus接口說明

接口 說明
reb_init REventBus初始化接口
reb_deinit REventBus去初始化接口
reb_subscribe REventBus訂閱事件接口
reb_unsbscribe REventBus取消訂閱事件接口
reb_publish REventBus同步發布事件接口
reb_async_publish REventBus異步發布事件接口

REventBus初始化接口

使用RThread_pool組件創建一個線程池

創建互斥量,解決共享資源問題。

初始化broker鏈表,用于事件代理。

pf_err_treb_init(void);

REventBus去初始化接口

線程池注銷,互斥量傷處,

pf_err_treb_deinit(void);

REventBus訂閱事件接口: pf_err_t reb_subscribe(const char *event, reb_handler_cb handler)

參數 描述
event 訂閱的事件,其是一個字符串類型
handler 事件處理函數,由訂閱者提供,事件產生時回調此函數
返回 ——
PF_EOK 訂閱事件成功
OTher 訂閱事件失敗

REventBus訂閱事件接口: pf_err_t reb_unsbscribe(const char *event, reb_handler_cb handler)

參數 描述
event 訂閱的事件,其是一個字符串類型
handler 事件處理函數,訂閱事件時所訂閱的回調函數
返回 ——
PF_EOK 取消訂閱事件成功
OTher 取消訂閱事件失敗

REventBus同步發布事件接口:pf_err_t reb_publish(const char *event, void *payload, uint16_t lenght)

參數 描述
event 訂閱者訂閱的事件類型
payload 發布事件的消息類型
lenght 發布事件的消息長度
返回 ——
PF_EOK 發布事件成功
OTher 發布事件失敗

REventBus異步發布事件接口:pf_err_t reb_async_publish(const char *event, reb_priority priority, void *payload, uint16_t lenght)

參數 描述
event 訂閱者訂閱的事件類型
priority 發布事件的優先級,REB_PRIORITY_HIGH和REB_PRIORITY_ORDINARY(目前未實現)
payload 發布事件的消息類型
lenght 發布事件的消息長度
返回 ——
PF_EOK 發布事件成功
OTher 發布事件失敗

REventBus演示

訂閱事件demo:

注意:同一個模塊定義多次定義同一個事件,只有第一個事件訂閱有效

#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*s
",event,lenght,payload);
}

intmain(void)
{
reb_init();

reb_subscribe("event1",reb_handler);
reb_subscribe("event1",reb_handler);
reb_subscribe("event2",reb_handler);

reb_info_dump();
}

效果:

bd59f63c-fe81-11ed-90ce-dac502259ad0.png

發布同步事件demo:

注意:發布同步事件,它是按照順序發布的,只有第一個事件處理完,才會處理第二個事件。

#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*s
",event,lenght,payload);
}

intmain(void)
{
rt_kprintf("----------------------
");
rt_kprintf("-Webcometoyouyeetoo-
");
rt_kprintf("----------------------
");
reb_init();

reb_subscribe("event1",reb_handler);
reb_subscribe("event1",reb_handler);
reb_subscribe("event2",reb_handler);

reb_info_dump();

while(1)
{
reb_publish("event1","youyeetoo:eventbus",rt_strlen("youyeetoo:eventbus"));
reb_publish("event2","Publishsyncmsg",rt_strlen("Publishsyncmsg"));
rt_thread_delay(1000);
}
}

效果:

bd6d725c-fe81-11ed-90ce-dac502259ad0.png

發布異步事件demo:

注意:發布異步事件,發布的事件不一定立馬執行,他會等待線程池的任務空閑時,才會執行。也就是執行時間不確定。

#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*s
",event,lenght,payload);
}

intmain(void)
{
rt_kprintf("----------------------
");
rt_kprintf("-Webcometoyouyeetoo-
");
rt_kprintf("----------------------
");
reb_init();

reb_subscribe("event1",reb_handler);
reb_subscribe("event1",reb_handler);
reb_subscribe("event2",reb_handler);

reb_info_dump();

while(1)
{
reb_publish("event1","youyeetoo:eventbus",rt_strlen("youyeetoo:eventbus"));
reb_publish("event2","Publishsyncmsg",rt_strlen("Publishsyncmsg"));
rt_thread_delay(100);
reb_async_publish("event1",REB_PRIORITY_ORDINARY,"GoodGood",rt_strlen("GoodGood"));
reb_async_publish("event2",REB_PRIORITY_ORDINARY,"Publishasyncmsg",rt_strlen("Publishasyncmsg"));
rt_thread_delay(100);
}
}

效果:

bd97944c-fe81-11ed-90ce-dac502259ad0.png

REventBus的優缺點

優點:

簡化組件與組件,業務與業務,組件與業務之間的通信方式。

對通信雙方做到完全解耦。

使用RThread pool靈活切換工作線程,一定程度提供了事件處理效率

支持同步事件發布,和異步事件發布。

資源占用極小。

缺點:

當業務多的時候,需要定義很多事件類型。

訂閱事件的時候,需要遍歷事件列表是否已經存在事件;發布的時候,也需要遍歷事件列表是否已經存在事件,性能不高。

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

    關注

    21

    文章

    4986

    瀏覽量

    140117
  • 接口
    +關注

    關注

    33

    文章

    8639

    瀏覽量

    151385
  • 開源
    +關注

    關注

    3

    文章

    3368

    瀏覽量

    42567

原文標題:框架解耦神器 -- REventBus

文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    設計和模擬厘米尺度超透鏡的工作流程

    本文介紹了設計和模擬厘米尺度超透鏡的工作流程
    的頭像 發表于 12-16 11:02 ?1122次閱讀
    設計和模擬厘米尺度超透鏡的<b class='flag-5'>工作流程</b>

    電氣CAD文件中高效的工作流程

    電氣CAD文件中高效的工作流程性能卓越的 PCschemetic ELautomation軟件具有作電氣設計時所需要的所有功能。其獨一無二的工作流程可節省您大量的時間,它代替了所有的訂貨信息——從
    發表于 12-04 11:24

    幫忙分析下這個設計的工作流程

    你好我是單片機學習的菜鳥能不能幫我分析一下一下設計的工作流程各個器件的工作原理
    發表于 12-07 11:06

    AndroidWifi工作流程

    AndroidWifi工作流程
    發表于 11-02 10:52

    AndroidWifi工作流程

    AndroidWifi工作流程
    發表于 09-25 11:17

    AndroidWifi工作流程

    AndroidWifi工作流程
    發表于 11-08 09:07

    Simulink是什么?Simulink的工作流程是怎樣進行的?

    Simulink是什么?Simulink有哪些功能?如何去使用Simulink?Simulink的工作流程是怎樣進行的?
    發表于 07-09 06:16

    AS068工作流程是怎樣的?

    AS068工作流程是怎樣的?
    發表于 12-07 08:02

    串口發送數據的配置與工作流程是怎樣的?

    串口發送數據的配置與工作流程是怎樣的?
    發表于 12-10 06:26

    財務管理工作流程

    財務管理工作流程
    發表于 03-30 20:42 ?8334次閱讀

    測試工程師工作流程有哪些

    測試工程師的工作流程,與公司的整體工作流程,項目的測試要求等因素相關。本文主要討論測試工程師的一般工作流程
    的頭像 發表于 10-03 16:56 ?7743次閱讀

    雷電的4K工作流程

    在4K的雷電工作流程
    的頭像 發表于 05-31 11:20 ?2441次閱讀

    工作流程圖怎么用?有哪些繪制工作流程圖的軟件

    工作流程圖是清晰地展示工作中各個環節的流程圖圖示,主要用于工作活動和效率的管理。工作流程圖這種圖示方法具有直觀描述性、簡潔性、可操作性和指導
    的頭像 發表于 07-28 14:22 ?3568次閱讀

    機器視覺系統的組成及工作流程

    機器視覺系統的組成及工作流程介紹。
    發表于 04-19 15:24 ?16次下載

    27個非常經典的設備工作流程圖解

    今天給大家分享27個非常經典的設備工作流程圖解。
    的頭像 發表于 06-02 17:16 ?1797次閱讀
    27個非常經典的設備<b class='flag-5'>工作流程</b>圖解
    主站蜘蛛池模板: 麻豆官网入口| 亚洲国产在线午夜视频无| 伊人久久大香线蕉影院95| 久久99视热频国只有精品| 在线va无卡无码高清| 男人吃奶摸下挵进去啪啪| 成人无码精品一区二区在线观看 | 女人十八毛片水真多啊| 国产91网站在线观看免费| 亚洲欧美日本中文子不卡| 嫩草影院在线观看精品| 国产精品久久久久久久人人看| 亚洲一区精品在线| 日本老妇一级特黄aa大片| 果冻传媒在线观看视频| jizz黑丝| 野花香在线观看免费观看大全动漫| 欧美一区二区三区久久综| 国内精品久久人妻无码HD浪潮| 99久久精品国产自免费| 亚洲福利视频导航| 欧美另类一区| 精品国产90后在线观看| 超碰v| 一个人的视频在线观看免费观看 | 日本xxxx96| 久久99这里只有精品| 俄罗斯摘花| 69xx欧美| 亚洲嫩草AV永久无码精品无码| 热99RE久久精品国产| 久亚洲AV无码专区A片| 国产女合集第六部| WWW亚洲精品久久久乳| 中文字幕成人| 亚洲第一页视频| 少妇人妻偷人精品视蜜桃| 暖暖视频免费观看社区| 久久久久青草大香线综合精品| 国产毛A片啊久久久久久A| 成人毛片手机版免费看|