GLib的主迴圈

2021-04-24 12:48:27 字數 1890 閱讀 5896

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 每秒幀數 而最能解釋遊戲主迴圈的就是固定的...