2009年8月6日 星期四

GLib 就是懶.g_timeout 週期性的做壞事

Standard
要是你有撰寫 JavaScript 的經驗,應該對 setTimeout() 一點都不陌生,簡而言之,該功能就是要『N 秒後』去呼叫某一個 function,該功能可以用到的地方很多,如寫一支時鐘程式時,每秒去更新顯示一次時間。當然,給懶人用的 GLIB 也有提供類似的功能,你可以在官方文件的『The Main Event Loop』一章找到詳細說明。

這是一段簡單的範例,每秒會 print 出一行 BAD! 字串:
#include <stdio.h>
#include <glib.h>

gboolean showme(gpointer user_data)
{
printf("BAD!\n");

/* TRUE 就繼續每秒跑一次;若是 return FALSE,則不再繼續執行 */
return TRUE;
}

int main(int argc, char **argv)
{
GMainContext *main_context;

/* 每秒跑一次 show() */
g_timeout_add(1000, showme, NULL);

/* 進入程式 Loop,例如:gtk_main() */
g_main_loop_run(g_main_loop_new (main_context, FALSE));
}

雖然 g_timeout 真正的底層實作並非如此,你還是可以想像它是建立一個新的 Thread,用 select() 去做 polling,至少在使用上有同等意義。此外,因為 g_timeout 是實作於 GLIB Main Loop 中,它無法非常精準的在多少秒後呼叫 function,通常會有一些極微小的延遲(幾乎感覺不到),不過對於極大多數的應用來說,非常足夠了。