glib g_main_loop理解
来源:互联网 发布:主对角占优矩阵 编辑:程序博客网 时间:2024/06/06 23:59
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的主要部件是GMainContext,GMainContext可以在多个GMainLoop间共享,但要求这些GMainLoop都在同一个线程中运行,前面提到的模态对话框就属于这一类。GMainContext通常由多个GSource组成,GSource是事件源的抽象,任何事件源,只要实现GSource规定的接口,都可以挂到GMainContext中来。
GSource的接口函数有:
1. gboolean (*prepare) (GSource *source, gint *timeout_);进入睡眠之前,在g_main_context_prepare里,mainloop调用所有Source的prepare函数,计算最小的timeout时间,该时间决定下一次睡眠的时间。
2. gboolean (*check) (GSource *source); poll被唤醒后,在g_main_context_check里,mainloop调用所有Source的check函数,检查是否有Source已经准备好了。如果poll是由于错误或者超时等原因唤醒的,就不必进行dispatch了。
3. gboolean (*dispatch) (GSource*source, GSourceFunc callback,gpointer user_data);当有Source准备好了,在g_main_context_dispatch里,mainloop调用所有Source的dispatch函数,去分发消息。
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管道实现的,mainloop在poll时,它除了等待所有的Source外,还会等待wake_up_pipe管道。要唤醒poll,调用g_main_context_wakeup_unlocked向wake_up_pipe里写入字母A就行了。
- glib g_main_loop理解
- glib g_main_loop理解
- glib g_main_loop理解
- glib g_main_loop理解
- g_main_loop
- glib 中 IO Channels 理解
- glib 中 IO Channels 理解
- glib 中 IO Channels 理解
- glib 中 IO Channels 理解
- glib 中 IO Channels 理解
- glib 中 IO Channels 理解
- glib 中 IO Channels 理解
- 理解 GLib 的单元测试框架
- glib学习笔记之三——GLib核心应用支持:glib 中 IO Channels 理解
- glib
- GLib
- Glib
- glib
- Delphi中MessageBox使用详解
- linux 文件描述符表 打开文件表 inode
- 七夕怀念
- selenium范例:python登录webqq
- hdu 2544 最短路
- glib g_main_loop理解
- Java_乔晓松_Java网络编程UDP
- DELPHI中Format函数功能及用法详解
- POJ 2389 Bull Math
- IIS下不能下载文件的docx文档,XLSX文档的设置方法
- C 语言相关(宏扩展、字节对齐)
- 3D打印会引发新的一轮盗版潮吗?
- Delphi的TStringList类使用详解
- python 内置函数