0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Glib创建自定义事件源的方法

如意 来源:CSDN 作者:CaspianSea 2020-06-22 11:56 次阅读

GLib 实现了一个功能强大的事件循环分发处理机制,被抽象成为 GMainLoop,用于循环处理事件源上的事件。每个 GMainLoop 都工作在指定的 GMainContext 上。事件源在 GLib 中则被抽象成了 GSource。在 GMainContext 中有一个 GSource 列表。GLib 内部定义实现了三种类型的事件源,分别是 Idle, Timeout 和 I/O。同时也支持创建自定义的事件源。

自定义事件源的基本作用

自定义的事件源可以用来将外部信号(事件)挂到程序中的指定主循环上,从而在 g_main_loop_run 中可以响应这些事件。

如何创建自定义事件源

GLib 提供了一系列的接口用于创建自定义的事件源,下面我们先讲解一下创建事件源的基本函数和数据结构,最后给出一些实例。

自定义的事件源是一个继承 GSource 的结构体,即自定义事件源的结构体 的第一个成员是 GSource 结构体, 其后便可放置程序所需数据,

实现了事件源数据结构的定义之后,还需要实现事件源所规定的接口,主要为 prepare, check, dispatch, finalize 等事件处理函数(回调函数),它们包含于 GSourceFuncs 结构体中。将 GSourceFuncs 结构以及事件源结构的存储空间宽度作为参数传给 g_source_new 便可构造一个新的事件源,继而可使用 g_source_attach 函数将新的事件源添加到主循环上下文中。

Timeout 类事件源,GLib 也提供了预定义的定时器事件源,其用法与 GLib 预定义的空闲事件源类似。例如:

如果要自定义定时器类型的事件源,只需让事件源的 prepare 与 check 接口在时间超过所设定的时间间隔时返回 TRUE, 否则返回 FALSE。

I/O 类型的事件源要稍微难理解一些,因为涉及到了操作系统层面的 poll 机制。所谓 poll 机制,就是操作系统提供的对文件描述符所关联的 I/O 的状态监视功能 ,例如向文件中写入数据 ,那么 I/O 的状态可以表示为 POLLOUT, 而从文件中读取数据,那么 I/O 的状态就变为 POLLIN。GLib 为 Unix 系统与Windows 系统的 poll 机制进行了封装,并且可以将文件与主事件循环的事件源建立关联,在主循环的过程中, g_main_loop_run 会轮询各个关联到文件的事件源,并处理相应的事件响应。I/O 类型的事件源, prepare,其 check, dispatch 等接口的执行次序如下:

a. 主事件循环会首先调用 check 接口, 询问事件源是否准备好。因为此时, g_main_loop_run 尚未轮询那些与 I/O 相关联的事件源, 所以 I/O 类型的事件源, check 接口的返回值应该是 FALSE。其主事件循环调用 g_main_context_iteration 轮询各事件源,探寻是否有 I/O 类型事件源的状态发生变化,并记录变化结果。

b. 主循环调用 check 接口, 询问事件是否准备好。此时, 如果 I/O 类型事件源的状态变化符合要求,那么就返回 TRUEE,否则返回 FALSE。

c. 如果 prepare 与 check接口的返回值均为 TRUE, 那么此时主事件循环会调用 dispatch 接口分发消息。

像 Idle 类型与 Timeout 类型事件源那样,GLib 也提供了预定义的 I/O 类型事件源,

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Glibc
    +关注

    关注

    0

    文章

    9

    浏览量

    7471
收藏 人收藏

    评论

    相关推荐

    LabVIEW自定义控件

    :4.同样的方法制作一个蘑菇的开始按钮:同时在前面板导入背景 图片“ 玛丼投 球”自定义控键和实例的关联关系:如果选择了自定义类型 或者严 格自定 义类型 ,那么
    发表于 01-07 10:57

    为labview类创建自定义探针

    通过自定义探针来访问需要访问的LabVIEW类成员vi信息,废话不说直接写原理过程:1. 创建一个demo.Lvproj2. Write data为成员vi3.上图为main.vi4. 右键探针创建
    发表于 03-22 10:32

    自定义链接描述文件怎么创建

    我正在为一个可引导加载的应用程序创建一个自定义链接器脚本。我使用和声来生成链接器脚本,它看起来是这样的:Full file here:http://pastebin.com/Xi2pzEn5然而
    发表于 11-01 10:29

    如何自定义Component 属性

    ,而是利用现有的API(例如,各种get,set方法)。===如果您想自定义组件,那么需要新创建一个类,并继承Component类,实现其基本的构造方法。然后,在其类内部实现具体的各种
    发表于 12-21 09:31

    OpenHarmony自定义组件介绍

    从父组件通过参数传递初始化子组件的成员变量,请参考状态管理。 自定义组件的参数规定 从上文的示例中,我们已经了解到,可以在build方法或者@Builder装饰的函数里创建自定义组件,
    发表于 09-25 15:36

    matlab自定义函数调用的方法

    matlab自定义函数调用的方法 命令文件/函数文件+ 函数文件 - 多
    发表于 11-29 13:14 88次下载

    在Protel中自定义Title Block的方法

    详细介绍了在Protel中自定义Title Block的方法
    发表于 05-24 11:42 0次下载
    在Protel中<b class='flag-5'>自定义</b>Title Block的<b class='flag-5'>方法</b>

    1602自定义字符

    1602液晶能够显示自定义字符,能够根据读者的具体情况显示自定义字符。
    发表于 01-20 15:43 1次下载

    在NI Multisim中创建自定义元器件

    在NI Multisim中创建自定义元器件,NI Multisim虽然强大但芯片太少所以总结这方法
    发表于 07-20 17:21 0次下载

    利用SDSoC创建自定义硬件

    SDSoC是开发Zynq-7000 SoC应用程序的理想工具,当您可以在自己的定制板平台上实现设计时,SDSoC变得更加强大。 有了这个视频,看看创建自己的自定义硬件是多么容易..
    的头像 发表于 11-26 06:25 2337次阅读

    自定义视图组件教程案例

    自定义组件 1.自定义组件-particles(粒子效果) 2.自定义组件- pulse(脉冲button效果) 3.自定义组件-progress(progress效果) 4.
    发表于 04-08 10:48 14次下载

    在16x2 LCD显示器上创建自定义动画

    电子发烧友网站提供《在16x2 LCD显示器上创建自定义动画.zip》资料免费下载
    发表于 10-24 09:28 0次下载
    在16x2 LCD显示器上<b class='flag-5'>创建</b><b class='flag-5'>自定义</b>动画

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 03-15 19:39 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 07-06 18:50 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    labview超快自定义控件制作和普通自定义控件制作

    labview超快自定义控件制作和普通自定义控件制作
    发表于 08-21 10:32 5次下载