
GObject
文章平均质量分 87
慢走胜过快跑
这个作者很懒,什么都没留下…
展开
-
Gobject tutorial 十三
不像我们的例子,GAction在GLib中有具体的使用功能。那么,在GSimpleAction中GAction是怎么实现的呢。下面,我们以glib-2.78.2/gio/tests/actions.c为例,来了解一下GAction的用法。此篇,我们只了解GAction的用法这一个点,而不深究GAction与GObject的关系。那什么是action呢?那,什么是action呢,在这里我们可以理解为一个鼠标点击动作。GAction是一个Interface,那么Interface对应的数据结构又是什么呢。原创 2024-07-18 20:29:36 · 372 阅读 · 0 评论 -
Gobject tutorial 十二
在g_io_unix_create_watch的函数体中我们看到了对GIOUnixWatch成员pollfd、channel、conditon的设置,而没有对source的设置,这是因为,GIOUnixWatch的地址与其成员source的地址一致。g_source_attach函数的主要工作是g_source_attach_unlocked函数完成。让我门回到g_io_add_watch_full,接下来,我们要分析函数g_source_set_callback。首先我们看看事件源的生成过程。原创 2024-07-06 16:45:21 · 837 阅读 · 0 评论 -
Gobject tutorial 十一
GValue & Boxed type原创 2024-06-26 11:36:00 · 641 阅读 · 0 评论 -
Gobject tutorial 十
主事件循环管理所有可用的事件源,事件可以是各种类型、各种数量的。比如说文件描述符(普通文件、管道以及套接字)和超时。新类型的事件源可以通过函数g_source_attach来添加。为了使多个相互独立的事件源集能在不同的线程中进行处理,每个事件源都会关联一个GMainContext。一个GMainContext只能在一个线程中运行,但, 事件源可以添加到一个线程中的GmainContext,而从另外一个线程的GMainContext中移除。我们来先来看看GLib中对事件源的定义。原创 2024-06-25 10:32:31 · 2000 阅读 · 0 评论 -
Gobject tutorial 九
当参数转换完成后,marhaaller还会调用用户提供的回调函数,并以刚刚转换完成的参数列表作为参数。Glib中有一个通用的函数,g_cclosure_marshal_generic,我们在平常在调用g_signal_new时,当将其参数c_marshaller设置为NULL时,g_cclosure_marshal_generic就是此时的默认marshaller.当然,还存在其他的marshaller,比如说g_cclosure_marshal_VOID__INT。回调函数的类型是GCallback。原创 2024-06-21 17:22:43 · 990 阅读 · 0 评论 -
Gobject tutorial 八
如果这是最后一个对对象B的引用,那么A释放对B的引用,会导致unref 函数执行对象B的dispose, 进而导致B对象释放对对象A的引用,如果这也是对对象A的最后一个引用,对象B对对象A的引用的释放会导致第二次执行A的dispose。既然在注册属性过程中,GparamSpec是必须的,那么,就有必要对生成GParamSpec的函数进行说明,我们以上例中的g_param_spec_float为例,看看Glib的说明。对于不同的对象实例,属性值是不同的,因此,属性值是存储在对象的实例中的。原创 2024-06-20 21:15:15 · 816 阅读 · 0 评论 -
Gobject tutorial 七
当g_object_new获取到新对象的初始化完成的类结构的索引之后,如果GObject的constructor函数被重写,那么,g_object_new函数将会调用新类型的类结构中constructor(如上例中的viewer_file_cosntructed,实际上也是新类ViewFileClass中GObject的constructor,这是因为,ViewFile是一个final类型对象)来创建新对象。GObject能够确保所有类结构和实例结构的成员(除指向父结构的成员外)的值都被设置为0。原创 2024-06-19 17:36:52 · 790 阅读 · 0 评论 -
Gobject tutorial 六
接着调用接口结构中base_init、default_init(class_int)、接口实现时所在类型的interface_init(例如Tint中的 t_compare_interface_init).如果同一个接口在很多类型中都存在实现(例如,Tcomparable在Tint,Tstr中都有实现),那么,接口实现所在的每个类型在初始化过程中,当轮到接口初始化时,接口中的base_init、interface_init都要执行一次,然而,default_init却只执行一次。其他成员还有接口函数指针。原创 2024-06-19 10:05:48 · 712 阅读 · 0 评论 -
Gobject tutorial 五
Type System Concepts原创 2024-06-17 20:09:05 · 1552 阅读 · 0 评论 -
Gobject tutorial 四
TIntCllass 初始化开始前,其父类TNumberClass已完成初始化。在应用程序第一次调用g_object_new(T_TYPE_INT,...)时,TIntClass会进行初始化。TNumber是abstract类型,不能直接实例化,也不能直接创建其class。但,当第一次创建其衍生类的实例时,TNumbe classr就会被初始化。原创 2024-06-17 09:22:56 · 241 阅读 · 0 评论 -
Gobject tutorial 三
在GLib中,类型可以分为两种。一种是可以被继承的(derivable),一种是不能被继承的(final)。二者的主要区别是,final 类型对象的类结构中,除了其父类外,再无其他成员。而derivable类型对象的类结构中会存在其他成员, 且derivable类型的类对其衍生类是可见的。对于上篇我们的例子TDouble,就是一个final类。我们在注册时使用的是G_DEFINE_TYPE,实际上还可以使用。原创 2024-06-15 18:45:19 · 1854 阅读 · 0 评论 -
Gobject tutorial 二
Type system and registration process原创 2024-06-15 10:44:51 · 844 阅读 · 0 评论 -
Gobject tutorial 一
参考: https://github.com/ToshioCP/Gobject-tutorial/tree/main?tab=readme-ov-fileGobject 实例是通过函数g_object_new创建的。Gobject不仅包含实例还包含类。从广义上来说,GObject是一个包含类和实例的对象。从狭义上来说,GObject仅仅是一个C结构体的定义。 g_object_new函数分配一个sizeof(GObject)大小的内存,并进行初始化,函数返回值是指向此分配内存的指针。此分配的内存就是一原创 2024-06-14 17:04:01 · 381 阅读 · 0 评论