GLib 實(shí)現(xiàn)了一個(gè)功能強(qiáng)大的事件循環(huán)分發(fā)處理機(jī)制,被抽象成為 GMainLoop,用于循環(huán)處理事件源上的事件。每個(gè) GMainLoop 都工作在指定的 GMainContext 上。事件源在 GLib 中則被抽象成了 GSource。在 GMainContext 中有一個(gè) GSource 列表。GLib 內(nèi)部定義實(shí)現(xiàn)了三種類型的事件源,分別是 Idle, Timeout 和 I/O。同時(shí)也支持創(chuàng)建自定義的事件源。
自定義事件源的基本作用
自定義的事件源可以用來(lái)將外部信號(hào)(事件)掛到程序中的指定主循環(huán)上,從而在 g_main_loop_run 中可以響應(yīng)這些事件。
如何創(chuàng)建自定義事件源
GLib 提供了一系列的接口用于創(chuàng)建自定義的事件源,下面我們先講解一下創(chuàng)建事件源的基本函數(shù)和數(shù)據(jù)結(jié)構(gòu),最后給出一些實(shí)例。
自定義的事件源是一個(gè)繼承 GSource 的結(jié)構(gòu)體,即自定義事件源的結(jié)構(gòu)體 的第一個(gè)成員是 GSource 結(jié)構(gòu)體, 其后便可放置程序所需數(shù)據(jù),
實(shí)現(xiàn)了事件源數(shù)據(jù)結(jié)構(gòu)的定義之后,還需要實(shí)現(xiàn)事件源所規(guī)定的接口,主要為 prepare, check, dispatch, finalize 等事件處理函數(shù)(回調(diào)函數(shù)),它們包含于 GSourceFuncs 結(jié)構(gòu)體中。將 GSourceFuncs 結(jié)構(gòu)以及事件源結(jié)構(gòu)的存儲(chǔ)空間寬度作為參數(shù)傳給 g_source_new 便可構(gòu)造一個(gè)新的事件源,繼而可使用 g_source_attach 函數(shù)將新的事件源添加到主循環(huán)上下文中。
Timeout 類事件源,GLib 也提供了預(yù)定義的定時(shí)器事件源,其用法與 GLib 預(yù)定義的空閑事件源類似。例如:
如果要自定義定時(shí)器類型的事件源,只需讓事件源的 prepare 與 check 接口在時(shí)間超過(guò)所設(shè)定的時(shí)間間隔時(shí)返回 TRUE, 否則返回 FALSE。
I/O 類型的事件源要稍微難理解一些,因?yàn)樯婕暗搅?a target="_blank">操作系統(tǒng)層面的 poll 機(jī)制。所謂 poll 機(jī)制,就是操作系統(tǒng)提供的對(duì)文件描述符所關(guān)聯(lián)的 I/O 的狀態(tài)監(jiān)視功能 ,例如向文件中寫入數(shù)據(jù) ,那么 I/O 的狀態(tài)可以表示為 POLLOUT, 而從文件中讀取數(shù)據(jù),那么 I/O 的狀態(tài)就變?yōu)?POLLIN。GLib 為 Unix 系統(tǒng)與Windows 系統(tǒng)的 poll 機(jī)制進(jìn)行了封裝,并且可以將文件與主事件循環(huán)的事件源建立關(guān)聯(lián),在主循環(huán)的過(guò)程中, g_main_loop_run 會(huì)輪詢各個(gè)關(guān)聯(lián)到文件的事件源,并處理相應(yīng)的事件響應(yīng)。I/O 類型的事件源, prepare,其 check, dispatch 等接口的執(zhí)行次序如下:
a. 主事件循環(huán)會(huì)首先調(diào)用 check 接口, 詢問(wèn)事件源是否準(zhǔn)備好。因?yàn)榇藭r(shí), g_main_loop_run 尚未輪詢那些與 I/O 相關(guān)聯(lián)的事件源, 所以 I/O 類型的事件源, check 接口的返回值應(yīng)該是 FALSE。其主事件循環(huán)調(diào)用 g_main_context_iteration 輪詢各事件源,探尋是否有 I/O 類型事件源的狀態(tài)發(fā)生變化,并記錄變化結(jié)果。
b. 主循環(huán)調(diào)用 check 接口, 詢問(wèn)事件是否準(zhǔn)備好。此時(shí), 如果 I/O 類型事件源的狀態(tài)變化符合要求,那么就返回 TRUEE,否則返回 FALSE。
c. 如果 prepare 與 check接口的返回值均為 TRUE, 那么此時(shí)主事件循環(huán)會(huì)調(diào)用 dispatch 接口分發(fā)消息。
像 Idle 類型與 Timeout 類型事件源那樣,GLib 也提供了預(yù)定義的 I/O 類型事件源,
-
Glibc
+關(guān)注
關(guān)注
0文章
9瀏覽量
7621
發(fā)布評(píng)論請(qǐng)先 登錄
如何添加自定義單板
matlab自定義函數(shù)調(diào)用的方法
在NI Multisim中創(chuàng)建自定義元器件
Qt自定義窗口部件的創(chuàng)建
利用SDSoC創(chuàng)建自定義硬件
如何制作自定義PCB形狀

自定義視圖組件教程案例
ArkUI如何自定義彈窗(eTS)
創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL)

如何快速創(chuàng)建用戶自定義Board和App工程

評(píng)論