g_idle_add函數介紹

我們知道glib提供了一個名爲g_idle_add的函數,這個函數的功能很容易理解:增加一個空閒任務,讓應用程序在空閒時執行指定的函數。這種機制非常有用,如果沒有這種機制,很多事情將非常麻煩。它的功能雖然簡單,但並不是所有人都知道如何充分發揮它的潛力,這裏說說它的幾個主要用途吧。
  
  1. 在空閒時執行低優先級任務。有的任務優先級比較低,但費耗時間比較長,像屏幕刷新等操作,我們不希望它阻礙當前操作太久,此時可以把它放到空閒任務裏去做。實際上GTK+裏面也是這樣做的,這樣可以獲得更好的響應性。
  
  2. 將同步操作異步化。我們知道在GTK+中,它使用glib的signal作爲窗口/控件之間的通信方式,signal的執行是直接調用函數,即整個signal的執行過程是同步完成的。這在多數情況下工作得很好,但有時會出現重入的問題,你調我,我再調你,可能會遇到麻煩。此時我們不得不採用異步方式,而GTK+沒有提供像Win32下的PostMessage之類的異步消息,幸好我們可以用g_idle_add函數來模擬。
  
  3. 串行化對GUI的訪問。在大多數平臺下,對GUI資源的訪問都是需要串行化的,即在一個GUI應用程序中,只有一個線程可以直接操作GUI資源。這是因爲出於效率的考慮, GUI資源是沒有加鎖保護的,GTK+也是這樣的。如果另外一個線程要訪問GUI資源,比如要顯示一條信息,怎麼辦呢?這可以通過g_idle_add增加一個空閒任務來實現,idle任務是GUI線程(主線程)中執行的,所以串行了對GUI資源的訪問。
  
  這裏要注意,idle任務並不是一個獨立的線程或者進程,而在是主線程中執行的。所謂空閒是指,當main loop沒有其它消息要處理,而且沒有更高優先級的工作要做時,就認爲處於空閒狀態。
發佈了58 篇原創文章 · 獲贊 8 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章