GLib 实现了一个功能强大的事件循环分发处理机制,GLib 内部实现了三种类型的事件源,分别是 Timeout, Idle, Child Watch。同时也支持创建自定义的事件源。
本文主要讲解自定义事件源的基本作用和如何创建自定义事件源。
自定义事件源的基本作用
自定义的事件源可以用来检查、分发处理 GLib 没有封装的用户自定义的事件。
如何创建自定义事件源
GLib 提供了一系列的接口用于创建自定义的事件源,下面我们先讲解一下创建事件源的基本函数和数据结构,最后给出一个实例。
这个函数用于创建一个自定义事件源,新的事件源可以使用 g_source_attach() 函数加入到主循环上下文中。
GSource * g_source_new(GSourceFuncs * source_funcs, guint struct_size);
source_funcs : 包含用于实现事件行为的函数的结构
struct_size : 创建的 GSource 结构大小,不能小于 sizeof(GSource)
返回值 : 返回新创建的 GSource
typedef struct
{
gboolean (*prepare) (GSource * source, gint * timeout);
gboolean (*check) (GSource * source);
gboolean (*dispatch) (GSource * source, GSourceFunc callback,
gpointer data);
void (*finalize) (GSource * source);
/* For use by g_source_set_cosure */
GSourceFunc closure_callback;
GSourceDummyMarshal closure_marshal;
} GSourceFuncs;
这是包含用于实现事件行为的函数的结构体。
prepare : 设置检查事件时间超时。如果返回 TRUE, check 会立刻被调用;如果返回 FALSE 并设置了 timeout , timeout 时间后 check 会被调用。
check : 检查事件是否准备完毕。返回 TRUE 为准备完毕, dispatch 会被立刻调用;返回 FALSE 不调用 dispatch,进入下一次事件循环。
dispatch : 分发事件。返回 TRUE 将继续下一次操作循环;返回 FALSE 中止本事件源的事件循环。
finalize : 当事件源被移除时被调用。
guint g_source_attach(GSource * source, GMainContext * context);
增加事件源到一个主循环上下文中。
source : 事件源对象
context : 主循环上下文对象
返回值 : 主循环上下文中的事件源ID(大于 0)
实例
#include <glib.h>
gboolean source_prepare_cb(GSource * source,
gint * timeout)
{
g_printf("prepare\n");
*timeout = 1000;
return FALSE;
}
gboolean source_check_cb(GSource * source)
{
g_printf("check\n");
return TRUE;
}
gboolean source_dispatch_cb(GSource * source,
GSourceFunc callback, gpointer data)
{
g_printf("dispatch\n");
return TRUE;
}
void source_finalize_cb(GSource * source)
{
g_printf("finalize\n");
}
int main(int argc, char * argv[])
{
GMainLoop * mainloop;
GMainContext * maincontext;
GSource * source;
GSourceFuncs sourcefuncs;
sourcefuncs.prepare = source_prepare_cb;
sourcefuncs.check = source_check_cb;
sourcefuncs.dispatch = source_dispatch_cb;
sourcefuncs.finalize = source_finalize_cb;
mainloop = g_main_loop_new(NULL, FALSE);
maincontext = g_main_loop_get_context(mainloop);
source = g_source_new(&sourcefuncs, sizeof(GSource));
g_source_attach(source, maincontext);
g_main_loop_run(mainloop);
return 0;
}
分享到:
相关推荐
4. **字体支持**:内建多种字符集和字体,包括ASCII字符集以及多种点阵字体,同时允许用户自定义字体。 5. **易于集成**:U8glib库的API设计简洁明了,便于开发者快速上手并集成到自己的项目中。 6. **更新与维护*...
GSource接口允许开发者注册自定义的事件源,使得程序可以灵活响应不同类型的事件。 在编译方面,描述中提到的过程复杂且依赖众多,这是因为GLib本身依赖于许多其他库,比如intltool、gettext、zlib、libffi等。编译...
6. **GMainLoop和GSource**: 这些是GLib事件循环的基础,它们负责处理各种输入源,如文件描述符、定时器和用户自定义事件,使得程序可以非阻塞地等待多个事件的发生。 7. **GError**: 错误处理系统,为C语言提供了...
一个简单的GLib应用可能包括初始化GLib运行时环境,创建和操作数据结构,使用GObject子类化创建自定义对象,以及利用GLib的异步和事件处理能力。例如,你可能创建一个GThread来执行后台任务,使用GQueue存储和处理...
1. **数据类型**:GLib提供了如GString(动态字符串)、GArray、GList、GSlist等自定义数据结构,便于高效处理各种数据。 2. **内存管理**:GLib提供了g_malloc、g_free等内存分配和释放函数,以及g_new、g_strdup等...
《glib-2.15.4:核心库与C语言编程...通过解压glib-2.15.4.tar.gz,开发者可以获得源代码,进行编译和定制,以满足特定项目的需求。在实际工作中,不断探索和学习glib的各个方面,是成为专业C语言程序员的重要步骤。
3. **线程支持**:GLib提供了线程API,包括线程创建、同步原语(互斥锁、条件变量)和线程安全的数据结构,使得开发者可以编写多线程应用。 4. **事件循环**:GLib的GMainLoop和GSource系统允许开发者实现异步编程...
GLib是GObject系统的基础,广泛用于GTK+和其他GNOME桌面环境的组件,提供了一系列基础数据结构、线程管理、定时器、事件循环等功能。 Balde框架旨在简化C语言编程中的常见任务,如内存管理、对象模型、事件处理等,...
通过这些源代码,开发者可以了解到如何创建窗口,添加控件,响应用户事件,以及自定义控件外观和行为。 "GTK-demo-application"是这个压缩包中的核心部分,它是一个可执行的程序,集合了所有GTK2.0的演示。运行这个...
4. **自定义控件**:如何基于现有控件创建自定义组件,以满足特定的UI需求。 5. **多线程和异步编程**:在GTK应用中,正确处理多线程和异步操作是避免界面冻结的关键。这部分可能涉及如何使用Glib的异步模型。 6. ...
"GLib Iteration Methods"的开源特性意味着这些方法是开放源代码的,开发者可以自由地查看、使用、学习和改进它们。 迭代是遍历和操作容器中元素的过程,例如数组、链表、树或哈希表等。在传统的GLib中,程序员通常...
- 对于C语言实现,开发者可能使用`glib`库进行内存管理和线程操作,用`GLib Main Loop`处理事件循环。 - 如果是Python,可以使用`PyGTK`或`GTK+3`的Python绑定,Python的内置数据结构和文件操作库会简化代码编写。...
这包括如何使用各种布局管理器来组织控件的位置和大小,以及如何创建自定义布局。 - **事件处理与交互**:这部分内容关注于如何处理用户输入和其他类型的事件,如鼠标点击、键盘按键等。通过这些事件,用户可以与...
GTK,全称GIMP Toolkit,是一个用于创建图形用户界面(GUI)的开源工具包,广泛应用于Linux和其他Unix-like操作系统。这个教程聚焦于GTK中的定时器功能,它是开发GTK应用程序时非常重要的一个组件,用于实现定时触发...
该库是对早期U8glib的升级版,提供了更多功能和改进的性能。 ### U8g2的主要特性: 1. **广泛的硬件支持**:U8g2支持各种各样的单色液晶显示器(LCD)和电子纸(E-Paper)显示器,包括SPI、I2C和串行接口的设备。 ...
5. 模板类和继承:gtkmm中的许多类都是模板化的,你可以根据需要创建自定义控件或派生已有的控件。 6. 主循环和事件处理:理解Glib::MainLoop和事件处理的基本原理,知道如何编写主程序以启动GUI并处理用户输入。 ...
- 包括创建复合构件的过程,如实现基本的行为、响应事件等。 #### 六、其他 - **rc 文件**: - GTK 使用 rc 文件来配置应用程序的外观和行为。 - 了解 rc 文件的格式和功能。 - **涂鸦板示例**: - 一个简单...
【Xen实践手册】 Xen是一种开放源代码的虚拟化技术,...源代码安装提供了更多的自定义选项,而使用Yum等包管理器则简化了流程。无论是哪种方式,成功安装后,Xen都可以有效地管理和运行虚拟机,提高硬件资源的利用率。
"gtkmm-2.4.0.tar.gz"是一个源代码包,包含了GTKMM库的2.4.0版本。这个版本在GTK+的基础上为开发者提供了丰富的功能和易用性。 GTKMM的核心是基于GTK+库,GTK+是一个广泛使用的跨平台GUI工具包,支持多种操作系统,...
在编译glib(GLib库,GTK+的基础库)时,libmount的源代码是必不可少的,因为glib可能直接或间接地依赖于libmount提供的功能。 **libmount核心概念** 1. **挂载系统**:在Linux中,挂载是指将文件系统与特定的目录...