sofsip学习系列--GLib学习笔记二,事件循环2

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
 

回到前一天的问题,除了交互性界面程序,还有哪些地方适合使用glib的event loop呢?我认为答案应该是,所有需要异步操作的地方都可以用event loop。像文件、管道、设备、socket、timer、idle和其他自定义的事件都可以产生event.
要让GMainLoop能够处理这些类型的event,首先就必须把它们加到GMainLoop去。
首先我们需要了解event loop的这三个基本结构:GMainLoop, GMainContext和GSource。
它们之间的关系是这样的:
GMainLoop -> GMainContext -> {GSource1, GSource2, GSource3......}
每 个GmainLoop都包含一个GMainContext成员,而这个GMainContext成员可以装各种各样的GSource,GSource则是 具体的各种Event处理逻辑了。在这里,可以把GMainContext理解为GSource的容器。(不过它的用处不只是装GSource)
创建GMainLoop使用函数g_main_loop_new, 它的第一个参数就是需要关联的GMainContext,如果这个值为空,程序会分配一个默认的Context给GMainLoop。
把GSource加到GMainContext呢,则使用函数g_source_attach。

接下来看这个例子,它的作用是从stdin读取字符串,然后反转字符串并输出到屏幕。

//mainloop2.c
#include <glib.h>
#include <stdio.h>
#include <strings.h>

GMainLoop* loop;

//当stdin有数据可读时被GSource调用的回调函数
gboolean callback(GIOChannel *channel)
{
    gchar* str;
    gsize len;
    //从stdin读取一行字符串
    g_io_channel_read_line(channel, &str, &len, NULL, NULL);
    //去掉回车键()
    while(len > 0 && (str[len-1] == '/r' || str[len-1] == '/n'))
        str[--len]='/0';
    //反转字符串
    for(;len;len--)
        g_print("%c",str[len-1]);
    g_print("/n");
    //判断结束符
    if(strcasecmp(str, "q") == 0){
        g_main_loop_quit(loop);
    }
    g_free(str);
}

void add_source(GMainContext *context)
{
    GIOChannel* channel;
    GSource* source;
    //这里我们监视stdin是否可读, stdin的fd默认等于1
    channel = g_io_channel_unix_new(1);
    //g_io_create_watch创建一个默认的io监视作用的GSource,下次再研究自定义GSource。参数G_IO_IN表示监视stdin的读取状态。
    source = g_io_create_watch(channel, G_IO_IN);
    g_io_channel_unref(channel);
    //设置stdin可读的时候调用的回调函数
    g_source_set_callback(source, (GSourceFunc)callback, channel, NULL);
    //把GSource附加到GMainContext
    g_source_attach(source, context);
    g_source_unref(source);
}

int main(int argc, char* argv[])
{
    GMainContext *context;

    if(g_thread_supported() == 0)
        g_thread_init(NULL);
    //新建一个GMainContext
    context = g_main_context_new();
    //然后把GSource附到这个Context上
    add_source(context);
    //把Context赋给GMainLoop
    loop = g_main_loop_new(context, FALSE);

    g_print("input string('q' to quit)/n");
    g_main_loop_run(loop);

    g_main_loop_unref(loop);
    //Context用完计数器减1
    g_main_context_unref(context);

    return 0;
}

 

glib事件循环 glib事件循环 阅读详情

相关推荐

GLib/Gstreamer代码浅析

GLib/Gstreamer代码浅析

David的博客 1683

Glib事件源

http://club.cqvip.com/showtopic-666157-6.aspx 从文章中摘出来一些,然后自己整理了一下。 GLib 实现了一个功能强大的事件循环分发处理机制,GLib 内部实现了三种类型的事件源,分别是 Timeout, Idle, Child W

finding的专栏 6922

嵌入式驱动源代码(22):函数回调之 Callback 机制

No0:callback应用场景 虽然经过一段时间对android源码的研究,初步理解如何从app将参数设置到Linux kernel(高通camera部分),但对上层如何获得底层数据困惑不已,最近通过对android frameworks、hal、application层代码的分析,有了初步理解,作简要总结,会在下一篇文章介绍具体实现细节: 上层通过使用callback机制来获得底层数据流-...

产品线负责人 5665

glib main event loop

glib  main event loop原文地址:http://baicj.spaces.live.com/blog/cns!F60F8E193FAC08E4!411.entry回到前一天的问题,除了交互性界面程序,还有哪些地方适合使用glib的event loop呢?我认为答案应该是,所有需要异步操作的地方都可以用event loop。像文件、管道、设备、sockettimer、idle和其

Y.Zhang 2713

七、GLib主要的事件循环(The Main Event Loop)

1 GMainLoop、GMainContext、GSource 1.1 三者之间关系 GMainLoop -> GMainContext -> {GSource1, GSource2,GSource3… } 每个GMainLoop都包含一个GMainContext成员,而这个GMainContext成员可以装各种各样的GSource,GSource则是具体的各种Event处理逻辑了。在这里,可以把GMainContext理解为GSource的容器,但是它的用处不只是装GSouce。 创建GM

Creationyang的博客 2500

基于glib的单线程多事件源处理

传统实现程序命令行的输入一般使用scanf或者getchar系统调用,这样,要求程序实现时要使用一个独立的线程检测用户的输入,这样就涉及到多线程编程的一系列问题。glib的mainloop机制可以提供单线程多事件源的注入,只要我们将用户的输入转换成GSource,就可以实现一种单线程的既可以响应用户输入,同时又能在输入的间隙处理其它事件的类并发模型。 1、基本概念 1.1 GMainContext

认真你就输了 3448

Glib学习22) 主事件循环 The Main Event Loop

glib源码下载:http://ftp.gnome.org/pub/gnome/sources/glib/ glib帮助文档:https://developer.gnome.org/glib/ 主事件循环 - 管理所有可用的事件源 Includes #include <glib.h> 描述 主事件循环管理GLib和GTK +应用程序的所有可用事件源。 这些事件可以来自任意数量的不同...

andylauren的专栏 8234

sofsip学习系列--GLib学习笔记事件循环

按着glib的文档顺序,先来看看事件循环吧。从最简单的例子开始://mainloop0.c#include GMainLoop* loop;int main(int argc, char* argv[]){    //g_thread_init是必需的,GMainLoop需要gthread库的支持。    if(g_thread_supported() == 0)        g_thread_

flyingfalcon的专栏 2353

sofsip学习系列--GLib学习笔记一,简介

用c/c++写东西的时候,经常需要自己实现一些常用的算法或功能,工作量很大很烦人。后来不经意间发现了glib库,觉得很不错,非常有必要研究一下。如果应用到将来的工作中,想必会大大提高工作效率和代码质量。glib库是一套跨平台的开发工具库,支持类Unix系统、Windows、BeOS等系统,基于LGPL协议。最新的开发文档版本是2.16.3,下载地址为http://library.gnome.org

flyingfalcon的专栏 1674

glib--消息分发(gmainloop,gsource),信号

每一个管道默认包含一个总线,所以应用程序不需要再创建总线。 应用程序只需要在总线上设置一个类似于对象的信号处理器的消息处理器。 当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务。  GLib对核心应用的支持包括事件循环、内存操作、线程操作、动态链接库的操作和出错处理与日志等。基本上,所有需要异步操作的地方都可以用事件循环。像文件、...

evsqiezi 5739

GMainLoop, GMainContext和GSource学习笔记

做过GUI开发相关工作的人的人都知道,很多应用程序都是事件驱动的。这些事件大部分都来自于用户,比如键盘事件、鼠标事件或遥控器事件。还有一些事件来自于系统内部,比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下,应用程序处于睡眠状态。     因为这种事件驱动机制,GUI应用程序都毫无例外的需要一个主循环(main loop)。主循环(main loop)控制应用程序什么

铁匠Smith先生的专栏 9038

深入理解qemu事件循环 —— 基本框架

qemu利用glib接口实现主线程的事件循环,如果没有glib接口的使用经验,理解起来比较困难,本文试图用glib接口的demo,分解qemu主事件循环

Take Easy,Work Hard! 5990

详细介绍Glib事件循环轻度分析与编程应用

详细介绍Glib事件循环轻度分析与编程应用

zhaominyong的专栏 606

基于C++实现的EventLoop与事件驱动编程

事件循环(Event Loop)是一个无限循环,它会不断地从事件队列中取出事件,并执行对应的回调函数。Event即事件,是事件驱动编程中的基本处理单元,可以理解为各种各样的信号,对于UI界面来说,鼠标点击、键盘输入、触摸屏输入都可以理解为事件。事件循环特别适用于异步编程,在事件循环中,程序会不断地等待事件的发生,并根据事件的类型和优先级来执行相应的处理逻辑。采用事件驱动编程的代码中,通常要有事件循环,侦听事件,以及不同事件所对应的回调函数。3.触发Event对应的请求以后,从队列中执行事件对应的回调函数。

木牛的博客 1718

Glib事件循环轻度分析与编程应用

三个案例轻松搞定 glib事件循环

个人笔记 3642

GLib核心应用支持

事件循环-管理所有可用的事件源 线程-对线程、互斥锁、锁、条件和线程私有数据的可移植支持 线程池—并发执行工作的线程池 异步队列-线程之间的异步通信 模块动态加载.动态加载“插件”的便携式方法 内存分配-常规内存处理 内存片—分配大小相等的内存块组的有效方法 IO通道-使用文件、管道和套接字的便携式支持 错误报告-报告错误的系统 警告和断言 消息输出和调试函数-用于输出消息和帮助调试应用程序的函数 ...

程序猿视角 1020

5_08_GLib库入门与实践_IO通道

简介 GIOChannel数据类型旨在提供一种可移植的方法来使用文件描述符、管道和套接字,并将它们集成到主事件循环中。目前,UNIX平台已完全支持,Windows平台只是部分支持。 要在UNIX系统上创建新的GIOChannel,可以使用使用 g_io_channel_unix_new(),这适用于普通文件描述符、管道和套接字。使用g_io_channel_new_file()可以以独立于系统的方式为文件创建通道。 一旦创建了 GIOChannel,就可以通过函数g_io_channel_read_char

field1003的博客 1430

GMainLoop的实现原理和代码模型

gtk_main(),clutter_main()中主事件循环的实现原理以及代码模型。GUI编程中所谓的事件机制的基本原理。

Embedded Linux Development 1万+

GLib 创建自定义事件源

转自 Heiher's Blog  https://heiher.info/848.html GLib 实现了一个功能强大的事件循环分发处理机制,被抽象成为 GMainLoop,用于循环处理事件源上的事件。每个 GMainLoop 都工作在指定的 GMainContext 上。事件源在 GLib 中则被抽象成了 GSource。在 GMainContext 中有一个 GSource 列表。GLi

junhua3344的专栏 2978
上一篇: sofsip学习系列--GLib学习笔记二,事件循环
下一篇: VOIP软交换FW/NAT穿透解决方案探讨
flyingfalcon
博客等级 码龄23年 25粉丝 24原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值