GMainLoop中的GSource

轉載時請註明出處和作者聯繫方式
文章出處:
http://blog.csdn.net/jack0106 
作者聯繫方式:馮牮 
[email protected]

 

上一篇文章GMainLoop的實現原理和代碼模型裏面,介紹了GMainLoop的代碼模型,其中的一些內容,還可以進一步討論一下。

 

1. 之前提到過,GSource和被管理的文件的對應關係,不是 1對1,而是 1對n,這個n,甚至可以是0。這個的意思就是說,一個GSource,可以對應(管理)一個文件描述符,也可以同時對應(管理)多個文件描述符,也可以一個都不管理。

glib中已經提供了幾個GSource的子類,其中的g_timeout_source_new(guint interval)和g_idle_source_new(void)這兩個函數構造出的GSource子類,就並不使用文件描述符號。

 

GTimeoutSource,只需要保存設定的間隔時間,在poll輪循的prepare和check階段,會去檢查設定的這個間隔時間是否到達,如果到達設定的時間,則它的dispatch函數會被調用。

 

g_idle_source_new(void)其實都沒有繼承GSource,它也不需要和文件綁定,只不過它的優先級比較低,只有在poll輪詢的空閒階段,它的dispatch函數會被調用。而它的prepare和check函數,始終都是返回的TRUE。

 

2. GMainLoop怎樣根據GSource的優先級進行調度?

在g_main_context_prepare()的時候,會從所有的GSource中找出最大的一個優先級,然後在g_main_context_query()的時候,只會把等於這個優先級的GSource對應的GPollFD添加到poll的監控集合中。基於這個優先級制度,GMainLoop就可以對GSource進行一個調度。以idle source爲例,如果同時有一個GTimeoutSource和idle source,因爲idle source的優先級更低,所有GMainLoop就不會把idle source添加到poll輪詢的監控集合中,也就是說,直到GTimeoutSource從GMainLoop中移除,idle source的callback函數,纔有機會被調用。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章