主事件循环机制(MEL:the Main Event Loop)在GLib和GTK应用中管理可用的事件源。事件源的类型包括:文件描述符(管道、套接字和常规文件)和定时器超时。
- guint g_source_attach (GSource* source, GMainContext* context)。往GMainContext中注册一个新的事件源GSource,不用考虑GMainContext的线程。如果context为NULL,即全局默认的主上下文。成功返回时,返回值为该事件源在GMainContext中的ID号。
- void g_source_destory(GSource* source)。将事件源GSource从上次注册的GMainContext中注销,注销后该事件源不可以再注册到任何其他上下文中。
不相关的事件源组可以被不同的线程处理,每个事件源关联一个GMainContext。虽然一个GMainContext只能运行在一个线程之中,而事件源可以在其他线程中注册或注销。所有操作GMainContext或内建GSource的方法都是线程安全的。
每个事件源都有一个优先级。默认的优先级G_PRIORITY_DEFAULT为0。优先级越高,数值越小。优先级高的事件源可以获得优先处理。
空闲函数,可以注册到GMainContext,也被分配一个优先级数值。当没有任何更高级别的事件源时,线程就运行空闲函数。
数据类型GMainLoop表示一个主事件循环。
- GMainLoop* g_main_loop_new ( GMainContext* context, gboolean is_running )。创建一个数据结构GMainLoop。
- void g_main_loop_run ( GMainLoop* loop ),该函数在调用g_source_attach之后运行,一旦运行该函数就会持续检查新的事件并分发给事件源处理函数。
- void g_main_loop_quit ( GMainLoop* loop ),导致g_main_loop_run退出,一般在事件源处理函数中调用。
一个新型事件源类型都是GSource结构派生出来。
- GSource* g_source_new ( GSourceFuncs* source_funcs, guint struct_size ),创建一个新的GSource事件源;其中GSourceFuncs是该事件源的处理函数指针,struct_size是在原生GSource结构体基础上需要扩展的内存长度。
主事件循环机制的有限状态机: