精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

關于Eventloop的概念

Q4MP_gh_c472c21 ? 來源:老吳嵌入式 ? 作者:吳偉東Jack ? 2022-09-28 09:42 ? 次閱讀

最近了解了一下 Eventloop 這個概念,所以想寫一篇文章整理一下思路。

1、Eventloop 是什么?

我在網上看了一些資料,但都比較復雜,而且大多和 JavaScript 扯上關系,對初學者不友好。

我個人理解的 Eventloop,其實就是在一個大循環里,處理各種各樣的事件。只是不同的 Eventloop 機制或者庫,在性能和適用場景之間有差別罷了。

一個程序,只要它需要一直工作,就會處于一個持續循環運行的狀態,我把這個循環的狀態,稱為 Eventloop。

舉個簡單的例子:

intmain()
{
intchoice;

do{
//等待用戶輸入
choice=getch();

switch(choice){
case'q':
break;

case'a':
add_record();
break;
[...]
}
}while(choice!='q');

exit(EXIT_SUCCESS);

}

上面這個程序,在一個 while 循環里,根據不同的鍵盤輸入事件,而執行不同的操作。

這就是一個簡單的 Eventloop,只是這個 Eventloop 只處理一種事件:鍵盤輸入,且是阻塞等待,雖然很簡陋,但是對于上面這個場景而言,已經夠用了。

Eventloop 隨處可見:

許多開源軟件,只要它們有持續運行 + 事件處理的需求,就會有自己的 Eventloop 實現,例如:

圖形庫 Qt 里的 QGuiApplication::run();

多媒體庫 SDL2 里的 SDL_PollEvent();

網絡庫 Mongoose 里的 mg_mgr_poll();

本質上都是一種 Eventloop,只是由于需求和應用場景的不一樣,各自的實現方法有所差異。

合格的 Eventloop:

一個合格的 Eventloop,需要有哪些特性?

我個人認為:

1、不要阻塞,即不要調用可能會阻塞的系統調用,或總是以 nonblocking 的方式調用系統調用。

2、能異步處理事件。

3、性能盡量高,以滿足業務需求為下限。

滿足上述三點,這個 Eventloop 在功能上就是夠用的。

2、Eventloop 怎么用?

基于 select 的 Eventloop:

這是來自 UNIX 網絡編程 16.2 章節的一個例子,其大致代碼如下:

str_cli(FILE*fp,intsockfd)
{
...

//setnonblock
val=Fcntl(sockfd,F_GETFL,0);
Fcntl(sockfd,F_SETFL,val|O_NONBLOCK);

//eventloop
for(;;){
...
Select(maxfdp1,&rset,&wset,NULL,NULL);

if(FD_ISSET(sockfd,&rset)){
//dosomething
}

...//otherevent
}
}

這個程序會從標準輸入中讀取一行數據,然后通過 socket 發送給服務端,然后接收服務端的響應,最后將響應也寫到標準輸出。

最關鍵的點是先調用 fcntl 將所有的輸入輸出都設置為 nonblock,然后用 select 監測所有的文件描述符。

基本上所有的開源事件庫,本質上和這個程序沒差別。

各種開源的 Eventloop 庫:

由于 Eventloop 是一個比較通用的需求,在開源軟件里,有許多優秀的異步事件庫都實現了這個功能。

比較適合嵌入式領域異步事件庫有 3 個:

libevent:an event notification library.

名氣最大,應用最廣泛,歷史最悠久的跨平臺事件庫。

libev:a high performance full-featured event loop written in C.

較 libevent 而言,設計更簡練,但是對 Windows 支持不夠好,并且和開源社區不怎么接軌。

libuv:a multi-platform support library with a focus on asynchronous I/O.

6cbdc1f6-3e1d-11ed-9e49-dac502259ad0.jpg

點擊查看大圖

開發 node.js 的過程中需要一個跨平臺的事件庫,目前非常活躍,推薦大家重點學習。

libev 最精簡,入門最容易,這里用它來介紹一下事件庫的用法:

#include
#include

//定義兩個事件watcher
ev_iostdin_watcher;
ev_timertimeout_watcher;

//iowatcher的回調函數
staticvoid
stdin_cb(EV_P_ev_io*w,intrevents)
{
puts("stdinready");
ev_io_stop(EV_A_w);
ev_break(EV_A_EVBREAK_ALL);
}

//timerwatcher的回調函數
staticvoid
timeout_cb(EV_P_ev_timer*w,intrevents)
{
puts("timeout");
ev_break(EV_A_EVBREAK_ONE);
}

intmain(void)
{
//定義eventloop
structev_loop*loop=EV_DEFAULT;

//初始化iowatcher
ev_io_init(&stdin_watcher,stdin_cb,/*STDIN_FILENO*/0,EV_READ);
ev_io_start(loop,&stdin_watcher);

//初始化timerwatcher
ev_timer_init(&timeout_watcher,timeout_cb,2,0.);
ev_timer_start(loop,&timeout_watcher);

//啟動eventloop
ev_run(loop,0);
return0;
}

libev 用 watcher 來檢測各種事件,當事件發生時,會調用 watcher 的回調函數。

那么,具體支持哪些事件類型呢?

6d124a14-3e1d-11ed-9e49-dac502259ad0.png

如果你對 libev 感興趣,可以根據下面這張圖閱讀其源碼:

6d573a34-3e1d-11ed-9e49-dac502259ad0.png6d8a6c2e-3e1d-11ed-9e49-dac502259ad0.png

審核編輯:湯梓紅

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

    關注

    3

    文章

    3253

    瀏覽量

    42408
  • javascript
    +關注

    關注

    0

    文章

    516

    瀏覽量

    53793

原文標題:不懂就問:什么是Eventloop?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    新手必看,關于ARM的22個常用概念

    文章具體介紹了關于ARM的22個常用概念。。##ARM體系結構的存儲器格式
    發表于 08-28 18:57 ?6301次閱讀

    關于ARM的22個常用概念--的確經典

    關于ARM的22個常用概念--的確經典
    發表于 08-20 14:00

    關于數字電路的基本概念和學習內容

    關于數字電路的基本概念和學習內容初學硬件電子電路設計的你知道數字電路的基本概念嗎?知道數字電路都學什么內容嗎?其實,電子電路硬件設計電路主要分為模電和數電兩部分,模電主要是關于電路分析
    發表于 07-22 16:46

    關于智能住宅若干概念

    關于智能住宅若干概念.doc
    發表于 09-10 13:35

    關于傳輸流以及傳輸流中幾個重要概念

    MPEG-2標準簡介以及數字電視功能分析關于傳輸流以及傳輸流中幾個重要概念信道解復用器是什么原理?
    發表于 04-21 06:53

    關于單片機的代碼和概念學習

    (需具有C語言基礎)關于單片機的組件基礎,請另行學習,本文章只針對代碼和概念進行學習,并不牽扯各個部件的連接步驟。首先看如下代碼:int val;//定義變量valint ledpin=13
    發表于 01-18 10:25

    關于虛擬HLR的概念,華為是否支持

    關于虛擬HLR的概念,華為是否支持 一個操作員可以對一定號段的用戶進行操作,互相之間不可見,不能干擾。這個一定的號段往往可以對
    發表于 06-30 09:47 ?681次閱讀

    關于計算機虛擬現實技術在概念設計中的實現

    關于計算機虛擬現實技術在概念設計中的實現  目前國際上流行的一種“故事版情景預言法”的概念設計,就是將要開發的產品置于一定的人、時、地、事和物中進行
    發表于 01-16 16:49 ?1132次閱讀

    關于單片機的一些基本概念

    關于單片機的一些基本概念  隨著電子技術的迅速發展,計算機已深入地滲透到我們的生活中,許多電子愛好者開始學習單片機知識,但單片機的內容比較抽象,相
    發表于 03-18 16:54 ?1092次閱讀

    關于智能住宅若干概念

    關于智能住宅若干概念
    發表于 08-07 10:09 ?0次下載

    處理器關于多核概念與區別 多核處理器工作原理及優缺點

    摘要:目前關于處理器的單核、雙核和多核已經得到了普遍的運用,今天我們主要說說關于多核處理器的一些相關概念,它的工作與那里以及優缺點而展開的分析。
    發表于 12-08 13:31 ?3.1w次閱讀

    關于噪聲的概念、產生及抑制方法的介紹

    4.6.1噪聲的基本概念
    的頭像 發表于 08-02 00:16 ?4695次閱讀

    關于鎖存器的time borrowing概念

    靜態時序分析經常會遇到基于鎖存器(latch)的設計從而引入了一個概念稱為“Time Borrowing”。這篇文章向大家解釋了什么是time borrowing,以及鎖存器(latch)設計和時序
    發表于 10-02 07:54 ?975次閱讀

    關于電池的元素和概念介紹

    視頻簡介:視頻主講關于電池的基礎關于電池的元素和概念。主要介紹了燃油測量技術,闡述了關機電壓、放電率、溫度和電池年齡的內在關系。
    的頭像 發表于 03-27 06:01 ?4206次閱讀
    <b class='flag-5'>關于</b>電池的元素和<b class='flag-5'>概念</b>介紹

    ISO 26262中關于失效的概念

    嗨,大家好!今天打算給大家分享一下ISO 26262中關于失效的概念,這也是功能安全所圍繞的核心問題。
    的頭像 發表于 09-22 10:30 ?7143次閱讀