关闭

glib g_main_loop理解

362人阅读 评论(0) 收藏 举报

main loop使用模式大致如下:

loop = g_main_loop_new (NULL, TRUE);

g_main_loop_run (loop);

 

g_main_loop_new创建一个main loop对象,一个main loop对象只能被一个线程使用,但一个线程可以有多个main loop对象。在GTK+应用中,一个线程使用多个main loop的主要用途是实现模态对话框,它在gtk_dialog_run函数里创建一个新的main loop,通过该main loop分发消息,直到对话框关闭为止。

 

g_main_loop_run则是进入主循环,它会一直阻塞在这里,直到让它退出为止。有事件时,它就处理事件,没事件时就睡眠。

 

g_main_loop_quit则是用于退出主循环,相当于Win32下的PostQuitMessage函数。

 

Glib main loop的最大特点就是支持多事件源,使用非常方便。来自用户的键盘和鼠标事件、来自系统的定时事件和socket事件等等,还支持一个称为idle的事件源,其主要用途是实现异步事件。Main loop的基本组成如下图所示:

 

GMainLoop的主要部件是GMainContextGMainContext可以在多个GMainLoop间共享,但要求这些GMainLoop都在同一个线程中运行,前面提到的模态对话框就属于这一类。GMainContext通常由多个GSource组成,GSource是事件源的抽象,任何事件源,只要实现GSource规定的接口,都可以挂到GMainContext中来。

 

GSource的接口函数有:

1.        gboolean (*prepare)  (GSource    *source, gint       *timeout_);进入睡眠之前,在g_main_context_prepare里,mainloop调用所有Sourceprepare函数,计算最小的timeout时间,该时间决定下一次睡眠的时间。

2.        gboolean (*check)    (GSource    *source); poll被唤醒后,在g_main_context_check里,mainloop调用所有Sourcecheck函数,检查是否有Source已经准备好了。如果poll是由于错误或者超时等原因唤醒的,就不必进行dispatch了。

3.        gboolean (*dispatch) (GSource*source, GSourceFunc callback,gpointer user_data);当有Source准备好了,在g_main_context_dispatch里,mainloop调用所有Sourcedispatch函数,去分发消息。

4.        void     (*finalize) (GSource    *source);Source被移出时,mainloop调用该函数去销毁Source

 

Main loop的工作流程简图如下

 

下面我们看看几个内置Source的实现机制:

Idle它主要用实现异步事件,功能类似于Win32下的PostMessage。但它还支持重复执行的特性,根据用户注册的回调函数的返回值而定。

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

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

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

 

Timeout它主要用于实现定时器,支持一次定时和重复定时,根据用户注册的回调函数的返回值而定。

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

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

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

 

线程可以向自己的mainloop中增加Source,也可以向其它线程的mainloop增加Source。向自己的mainloop中增加Source时,mainloop已经唤醒了,所以不会存在什么问题。而向其它线程的mainloop增加Source时,对方线程可能正挂在poll里睡眠,所以要想法唤醒它,否则Source可能来不及处理。在Linux下,这是通过wake_up_pipe管道实现的,mainlooppoll时,它除了等待所有的Source外,还会等待wake_up_pipe管道。要唤醒poll,调用g_main_context_wakeup_unlockedwake_up_pipe里写入字母A就行了。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

centos下编译glib Library并安装

环境说明:                        Linux版本 : CentOS Linux release 7.1.1503 (Core)   ...
  • u013575812
  • u013575812
  • 2015-12-05 22:37
  • 2037

libgit2:纯C语言实现的Git开发包

发表于2013-10-29 17:29| 4359次阅读| 来源CSDN| 4 条评论| 作者张红月 gitstackoverflowvisual studio开源libgit2...
  • dj0379
  • dj0379
  • 2013-10-31 18:45
  • 1300

c标准基本库函数:libc、glibc和glib的关系

【glibc 和 libc】  glibc 和 libc 都是 Linux 下的 C 函数库。  libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN...
  • xiaohaijiejie
  • xiaohaijiejie
  • 2016-07-03 12:10
  • 2466

glib g_main_loop理解

http://soft.zdnet.com.cn/software_zone/2008/0214/735181.shtml   main loop使用模式大致如下: loop =...
  • fingding
  • fingding
  • 2011-10-13 11:43
  • 13723

g_main_loop_new (NULL, FALSE) 原理分析

我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自于用户,比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部,比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下...
  • arag2009
  • arag2009
  • 2013-12-03 14:48
  • 4780

g_main_loop_new

采摘处:http://blog.csdn.net/liluvu/article/details/5577155 按着glib的文档顺序,先来看看事件循环吧。 从最简单的例子开始: ...
  • crazy_fire
  • crazy_fire
  • 2012-04-18 17:22
  • 862

理解WebKit和Chromium: 渲染主循环(main loop)和requestAnimationFrame

## 概述 曾经写过一段JavaScript代码,因为涉及到需要循环调用某个函数来实现动画的功能,很自然地,我想到了使用setInterval函数(或者setTimeout,大家是否有类似经历呢...
  • alex8046
  • alex8046
  • 2015-07-10 15:18
  • 485

GLib Event Loop

转自出处 GLib Event Loop The GLib event loop manages all the sources of an event ava...
  • martin_liang
  • martin_liang
  • 2012-06-10 23:30
  • 1251

U-boot主循环main_loop分析

转载地址:http://www.eefocus.com/cubieboards/blog/14-08/305273_2120d.html 最近在写cortex-M3的一个裸机程序,写的过程中突然...
  • kunkliu
  • kunkliu
  • 2017-12-06 13:25
  • 37

GTK学习(4)-主循环(main loop)的工作原理

GTK+主循环(main loop)的工作原理 我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自于用户,比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部,比如定时事件、sock...
  • u013181595
  • u013181595
  • 2017-08-07 15:45
  • 153
    个人资料
    • 访问:146427次
    • 积分:4466
    • 等级:
    • 排名:第7739名
    • 原创:290篇
    • 转载:158篇
    • 译文:0篇
    • 评论:64条
    最新评论