GLib的主循环

 

GUI应用程序都是事件驱动的。这些事件大部分都来自于用户,比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部,比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下,应用程序处于睡眠状态。因为这种事件驱动机制,GUI应用程序都毫无例外的需要一个主循环(main loop),主循环控制应用程序什么时候进入睡眠状态,什么时候被唤醒。

Glib所提供的主循环便是GMainLoopGMainLoop的主要部件是主循环上下文(GMainContext)GMainContext可以在多个GMainLoop间共享,但要求这些GMainLoop在一个线程中运行。GMainContext通常由多个事件源(GSource)组成,GSource是事件源的抽象,任何事件源,只要实现GSource规定的接口,都可以挂到GMainContext中来,三者之间的关系见图

  

一个GSource主要实现下面几个接口:

Ø         prepare

进入睡眠之前,mainloop调用所有Sourceprepare函数,计算最小的timeout时间,该时间决定下一次睡眠的时间。

Ø         check

被唤醒后, mainloop调用所有Sourcecheck函数,检查是否有Source已经准备好了。

Ø         dispatch

当有Source准备好了,mainloop调用所有Sourcedispatch函数,去分发消息。

Ø         finalize

Source被移出时,mainloop调用该函数去销毁Source

主循环的简单工作流程图如下:

 

 

       Glib提供了几个内置的事件源,如IdleTimeout,其内置实现机制如下:

Idle 它主要用实现异步事件,当主循环没有其它事情做时,idle函数连续运行,即只有主循环正常空闲着且没有其它事件处理时,idle函数才会运行,且它还支持重复执行的特性,根据用户注册的回调函数的返回值而定。

1).  g_idle_prepare把超时设置为0,也就是即时唤醒,不进入睡眠状态。

2).  g_idle_check 始终返回TRUE,表示准备好了。

3).  g_idle_dispatch 调用用户注册的回调函数。

Timeout 它主要用于实现定时器功能,支持一次定时和重复定时,根据用户注册的回调函数的返回值而定,返回TRUE时重复执行,返回FALSE时则被移除。

1). g_timeout_prepare 计算下一次的超时时间。

2). g_timeout_check 检查超时时间是否到了,如果到了就返回TRUE,否则返回FALSE

3). g_timeout_dispatch调用用户注册的回调函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值