2021年1月21日 星期四

[暫存]glib學習記錄

g_source_remove

g_io_add_watch返回事件源ID,之後可以以該事件源ID用g_source_remove再次動態刪除監視。每個FD使用一個事件源,而不是修改現有的監視,而是刪除舊的監視並創建適當的監視

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沒有其它消息要處理,而且沒有更高優先級的工作要做時,就認為處於空閒狀態。


輸出g_debug() 內容

從GLib 2.32開始,一個使GLib默認日誌處理函數更可用的補丁程序g_debug()在正常情況下是不被輸出到終端上的。當需要啟用調試的時候需要顯式的通過環境變量G_MESSAGES_DEBUG來打開g_debug()的輸出。

編譯前在terminal上 export G_MESSAGES_DEBUG=all 

再執行程式就可以看到g_debug輸出的內容了。


沒有留言:

張貼留言