glib main event loop

CommonAPI框架解析:C++分布式通信的标准化接口与工程实践 在分布式系统开发中,接口定义与通信协议解耦是提升软件可维护性和可移植性的关键技术。通过接口描述语言(IDL)定义服务契约,可以实现服务提供方与消费方的标准化交互,屏蔽底层通信细节。这一原理在C++大型软件架构中尤为重要,它通过代码生成技术自动创建客户端代理和服务端桩代码,将业务逻辑与通信实现分离。其技术价值在于支持多种通信中间件(如D-Bus、SOME/IP),使同一套业务代码能够无缝适配不同传输协议,极大增强了系统在跨平台、跨进程场景下的适应能力。这一模式广泛应用于汽车电子、工业自动化等对模块化和可扩展性 阅读详情
glib  main event loop
原文地址:http://baicj.spaces.live.com/blog/cns!F60F8E193FAC08E4!411.entry

回到前一天的问题,除了交互性界面程序,还有哪些地方适合使用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;
}


编译运行玩玩吧~
我比较喜欢用代码说话,完全违背了侯捷老师不用代码的宗旨。。。


BeagleBone Green LCD Cape开发实战:驱动配置、图形界面与性能优化 嵌入式系统的人机交互(HMI)开发是连接硬件与用户的关键环节,其核心在于通过图形界面实现信息的可视化与操作的直观化。其技术原理通常涉及显示驱动、输入设备管理和图形渲染框架。在嵌入式Linux平台上,设备树(Device Tree)是描述和配置硬件的标准机制,它定义了外设的连接与资源分配,是驱动加载的基础。图形应用开发则可根据需求选择轻量级的Framebuffer方案(如SDL、GTK+直接渲染)或功能完整的X Window方案(如Qt、PyGTK)。这些技术的价值在于能快速构建稳定、高效的交互界面,降低开发 阅读详情

相关推荐

TypeScript终端Agent架构实践:pi-tui与SEA构建毫秒级AI编程助手

终端Agent是一种运行在命令行环境、具备实时交互与流式AI响应能力的新型智能工具,其核心挑战在于平衡毫秒级UI响应、状态一致性与跨平台可分发性。传统Python方案受限于GIL和异步模型,在键盘事件同步、ANSI增量渲染和进程间通信上存在固有延迟;而TypeScript凭借Node.js的统一事件循环、类型驱动的契约式开发,以及pi-tui提供的终端硬件抽象层(HAL),实现了像素级缓冲控制与帧同步渲染。结合SEA(Single-Executable Application)技术,可打包为免依赖二进制,显

weixin_34228387的博客 489

Glib事件源

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

finding的专栏 6922

【BlueZ】源码目录结构全解析:一分钟看懂各文件夹核心作用

BlueZ 作为 Linux 平台唯一官方蓝牙协议栈,采用模块化分层架构设计。绝大多数开发者编译裁剪失败、功能代码找不到、问题无从定位,本质是不熟悉源码目录职责边界。本文承接系列前文内核决定兼容上限、依赖库决定编译下限核心理论,基于 BlueZ 5.87 原版源码,系统性拆解全版本通用目录架构,打通目录结构→编译参数→功能模块→问题定位完整链路,是 BlueZ 源码阅读、二次开发、移植适配的官方级手册。

byte轻骑兵的技术小窝 1万+

七、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的博客 2501

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

传统实现程序命令行的输入一般使用scanf或者getchar系统调用,这样,要求程序实现时要使用一个独立的线程检测用户的输入,这样就涉及到多线程编程的一系列问题。glibmainloop机制可以提供单线程多事件源的注入,只要我们将用户的输入转换成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的专栏 8235

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

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

evsqiezi 5739

GLIB: The Main Event Loop

不相关的事件源组可以被不同的线程处理,每个事件源关联一个GMainContext。虽然一个GMainContext只能运行在一个线程之中,而事件源可以在其他线程中注册或注销。主事件循环机制(MEL:the Main Event Loop)在GLib和GTK应用中管理可用的事件源。事件源的类型包括:文件描述符(管道、套接字和常规文件)和定时器超时。每个事件源都有一个优先级。优先级越高,数值越小。优先级高的事件源可以获得优先处理。空闲函数,可以注册到GMainContext,也被分配一个优先级数值。

736

glib-The Main Event Loop

参考: https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#GMainContext Description:The main event loop manages all the available sources of events for GLib and GTK+ applications. Thes

you 646

GLIB main event loop

下面是一个小程序,其实是一个简单的事件触发模型: #include #include #include GMainLoop *loop; gboolean callback(GIOChannel *channel) { gchar *str; gsize len; /*stdin*/ g_io_channel_read_line(channel, &st

小猪爱拱地 1300

Glib官方文档阅读 The Main Event Loop

头文件 #include <glib.h> 描述 主事件循环管理GLib和GTK+应用程序的所有可用事件源。这些事件可以来自任何数量的不同类型来源,如文件描述符(普通文件、管道或套接字)和超时。也可以使用g_source_attach()添加新类型的事件源。 为了允许在不同线程中处理多个独立的源集,每个源都与一个GMainContext相关联。一个GMainContext只能在单个线程中运行,但可以从其他线程将事件源加入或移除。所有在GMainContext或内置GSource上运行的函数都是

qq_21311911的博客 456

glib学习笔记 main event loop

回到前一天的问题,除了交互性界面程序,还有哪些地方适合使用glibevent loop呢?我认为答案应该是,所有需要异步操作的地方都可以用event loop。像文件、管道、设备、sockettimer、idle和其他自定义的事件都可以产生event.要让GMainLoop能够处理这些类型的event,首先就必须把它们加到GMainLoop去。首先我们需要了解event loop的这三个基本结

lihuijiangsu的专栏 1203

glib学习笔记-1 2 main event loop 1 2

引用自: http://baicj.spaces.live.com/blog/cns!F60F8E193FAC08E4!410.entry http://baicj.spaces.live.com/blog/cns!F60F8E193FAC08E4!411.entry?wa=wsignin1.0&amp;sa=837669587   按着glib的文档顺序,先来看看事件循环吧。 从最...

Linux Job 641

glib学习笔记-1 main event loop 1

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

suxinmin的专栏 1031

The Main Event Loop (glib ) 主事件循环

https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add-seconds

xasylt的专栏 505

探究如何整合 GLib Main Event Loop 和 Node.js 的 libuv

这个作者写了许多glib的东西,值得借鉴,牛人呀 原文地址:http://iteches.com/archives/5259 在普通情况下,整合 GLib Main Event Loop 和 libuv 不是件平常人会做的事,因为,一般人使用着 GTK+、Clutter、DBus 等等函式库(Library)时,永远只会使用 GLib 而不会使用到第二套事件引擎。但是,在 Node.js

yazhouren的专栏 2030

Main Event Loop机制调研报告

<br />Main Event Loop 可以管理所有可用的事件资源,这些资源可以是任意数量的不同的资源,例如文件描述符(普通文件、管道或者套接字)或者超时。用户可以定义自己其它类型的资源,但这需要使用g_resource_attach()进行关联。<br />在Main Event Loop中每一个事件资源都被赋予一个优先级。用户可以指定默认优先级,默认的优先级是G_PRIORITY_DEFAULT,它的值是0。值比0小的意味着更高的优先级。值比0大的意味着更低的优先级。高优先级的事件资源总是比低优先级

shuningzhang的专栏 2802

Dialect 异步编程实践:asyncio + GTK 事件循环与 background_task 深度揭秘

Dialect 是一款基于 GTK4 的 GNOME 翻译应用,它的异步编程实践堪称教科书级范本。本文将深度揭秘 Dialect 如何将 Python asyncio 与 GTK 事件循环无缝融合,剖析核心的 background_task 装饰器机制,并带你看懂一次翻译请求背后的完整异步旅程。无论你是 GTK 开发新手,还是对 asyncio 事件循环好奇的普通用户,这篇 GTK4 异步编程指南

gitblog_00980的博客 754
上一篇: connet()超时连接的一般方
下一篇: pthread_mutex_lock
MarkZ_
博客等级 码龄18年 3粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值