gui
應用程式都是事件驅動的。這些事件大部分都來自於使用者,比如鍵盤事件、滑鼠事件或筆點事件。還有一些事件來自於系統內部,比如定時事件、
socket
事件和其它檔案事件等等。在沒有任何事件的情況下,應用程式處於睡眠狀態。因為這種事件驅動機制,
gui應用程式都毫無例外的需要乙個主迴圈
(main loop)
,主迴圈控制應用程式什麼時候進入睡眠狀態,什麼時候被喚醒。
glib
所提供的主迴圈便是
gmainloop
,gmainloop
的主要部件是主迴圈上下文
(gmaincontext)
,gmaincontext
可以在多個
gmainloop
間共享,但要求這些
gmainloop
在乙個執行緒中執行。
gmaincontext
通常由多個事件源
(gsource)
組成,gsource
是事件源的抽象,任何事件源,只要實現
gsource
規定的介面,都可以掛到
gmaincontext
中來,三者之間的關係見圖。
乙個gsource
主要實現下面幾個介面:ø
prepare
進入睡眠之前,
mainloop
呼叫所有
source
的prepare
函式,計算最小的
timeout
時間,該時間決定下一次睡眠的時間。
øcheck
被喚醒後,
mainloop
呼叫所有
source
的check
函式,檢查是否有
source
已經準備好了。
ødispatch
當有source
準備好了,
mainloop
呼叫所有
source
的dispatch
函式,去分發訊息。
øfinalize
在source
被移出時,
mainloop
呼叫該函式去銷毀
source
。主迴圈的簡單工作流程圖如下:
glib
提供了幾個內建的事件源,如
idle
、timeout
,其內建實現機制如下:
idle
它主要用實現非同步事件,當主迴圈沒有其它事情做時,
idle
函式連續執行,即只有主迴圈正常空閒著且沒有其它事件處理時,
idle
函式才會執行,且它還支援重複執行的特性,根據使用者註冊的**函式的返回值而定。
1). g_idle_prepare
把超時設定為
0,也就是即時喚醒,不進入睡眠狀態。
2). g_idle_check
始終返回
true
,表示準備好了。
3). g_idle_dispatch
呼叫使用者註冊的**函式。
timeout
它主要用於實現定時器功能,支援一次定時和重複定時,根據使用者註冊的**函式的返回值而定,返回
true
時重複執行,返回
false
時則被移除。
1). g_timeout_prepare
計算下一次的超時時間。
2). g_timeout_check
檢查超時時間是否到了,如果到了就返回
true
,否則返回
false
。3). g_timeout_dispatch
呼叫使用者註冊的**函式。
在不學glib就對不起博主了!!
標題是我自己加的,gnome是基於gtk 開發的一套桌面環境,gnome和kde作為兩大最流行的桌面環境,在全世界廣泛使用。只要是在linux下工作的開發人員,對於gtk 一定不陌生。而對於glib,這個gtk 下的無名英雄,其功能強大卻鮮為人知。今天,在這裡簡要介紹一下,如果你是開發人員,看完本文...
Postmaster主迴圈的大致流程
postmaster.c 中,主迴圈的大致流程如下 main idle loop of postmaster static intserverloop void else now check the select result if selres 0 new connection pending o...
遊戲主迴圈 Game Loop 詳解
每乙個複雜的應用程式的核心都是乙個迴圈 loop 貫穿於乙個應用程式生活週期的是一部分 不斷的重複執行時間.這個迴圈 loop 可以就說是主迴圈。主迴圈的主要作用是 協調程式的行為 事件 和建裡應用程式的中樞。1.事件驅動 使用者輸入 2.固定時間的fps 每秒幀數 而最能解釋遊戲主迴圈的就是固定的...