转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli@gmail.com>
带图形用户界面(GUI)的应用程序和传统的批处理程序是不同的:
* 批处理程序是一步一步的执行,直到完成任务为止,完成任务后程序立即退出。
* 图形用户界面应用程序则是事件驱动的,它等待事件发生,然后处理事件,如此循环,直到用户要求退出为止。
两种执行模型如下图所示:
通常我们把等待事件/处理事件的循环称为主循环(MainLoop),主循环是GUI应用程序必要组件之一,FTK当然也离开不主循环 (MainLoop)。大多数嵌入式GUI都采用了Windows类似的主循环:
while(GetMessage(&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我不太喜欢这种主循环,主要原因有两点:
* 它看似简洁,但内部实现并不简洁。它从当前线程的队列里获取消息,然后处理消息。这些消息从来哪里的?当然是由其它线程传递给当前线程的,这就意味着 GUI需要多线程的支持。而FTK不想引入多线程来折磨自己,至少在GUI部分是不想的。
* 这是面向过程的处理方式。消息是一个对象,按照面向对象的思想来说,对象的数据和行为应该绑定在一起。而这里的消息是纯粹的数据,所有消息都由目标窗口的消息处理函数来处理的。FTK希望每类消息都有自己的处理函数,而不是全部由窗口来处理。
FTK采用了GTK类似的主循环:
ftk_run();
它看起来更简洁,内部实现也不需要多线程的支持。这里采用了POSA(面向模式的软件架构)中的Reactor模式,它的主要好处有:
* 用单线程处理多个事件源。
* 增加新事件源时不会影响事件分发的框架。
整个主循环由下列组件构成:
FtkSource 是一个接口,是所有事件源的抽象,它要求事件源实现下列函数:
* ftk_source_get_fd 用来获取文件描述符,当然这个文件描述符不一定是真正的文件描述符,只要是MainLoop能挂在上面等待的句柄(Handle)即可。
* ftk_source_check 用来检查事件源要求等待的时间。-1表示不关心等待时间。0表示要马就有事件发生,正数表示在指定的时间内将有事件发生。
* ftk_source_dispatch 用来处理事件,每个事件源都有自己的处理函数,而不是全部耦合到窗口的处理函数中。
FtkSourcesManager负责管理所有事件源。主要提供下列函数:
* ftk_sources_manager_add 增加一个事件源。
* ftk_sources_manager_remove 删除一个事件源。
* ftk_sources_manager_get_count 获取事件源总数。
* ftk_sources_manager_get 获取指定索引的事件源。
FtkMainLoop负责循环的等待事件发生,然后调用事件源的处理函数去处理。主要提供下列函数:
* ftk_main_loop_run 启动主循环
* ftk_main_loop_quit 退出主循环
* ftk_main_loop_add_source 增加一个事件源
* ftk_main_loop_remove_source 删除一个事件源
FtkMainLoop提供了add_source和remove_source两个函数对 FtkSourcesManager相应函数进行包装,这里包装不是简单的调用FtkSourcesManager的函数,而是发送一个事件:
为什么要多此一举呢?原因这样的:FTK是单线程的,GUI线程只负责用户界面的管理,由后台工作的线程负责长时间的操作。但是后台工作的线程经常需要更新用户界面,比如下载网络数据的线程要更新下载进度界面。FTK需要提供一种机制,让后台线程来更新用户界面但又不需要引入互斥机制。这可以通过 idle来串行化对GUI的操作,后台线程要更新GUI时,就增加一个idle source,后台线程不能直接调用ftk_sources_manager_add,那样需要互斥机制,而且也不能唤醒主循环去处理这个idle。所以它通过Primary Source的管道发送一个事件,这个事件会唤醒睡眠中的主循环,然后调用Primary Source分发函数去处理事件。
现在我们来看ftk_main_loop_run的实现,ftk_main_loop_run的实现是平台相关的,对于支持select的平台,用 select是最好的方法。下面是基于select的实现:
1.找出最小等待时间和文件描述符
这里遍历所有source,找出一个最小的等待时间和要等待的文件描述符。
2. 等待事件发生
3.检查事件源并调用相应的事件处理函数
如果事件源处理函数的返回值不是RET_OK的事件,我们认为出错了或者是事件要求自己被移除,那就把它移除掉。
GUI是事件驱动的,创建一个窗口后,函数马上就返回了,窗口中的控件对用户事件处理是在以后的事件循环中进行的。这对于大多数情况是正常的,但有时我们需要用户确认一些问题,根据确认的结果做相应的处理。比如,用户删除一个文件,我们要确认他是否真的想删除后才能去删除。也就是在创建对话框后,函数不是马上返回,而且等用户确认,关闭对话框后才返回。
为了做到这一点,我们要在一个事件处理函数中,创建另外一个主循环来分发事件。模态对话框就是这样实现的:
对话模型提供了一个用于退出该主循环的函数:
相关推荐
字节开源 DeerFlow 2.0:从 Deep Research 到 Super Agent Harness 的进化之路
GitHub Trending 冠军项目,字节跳动完全开源的超级智能体框架。支持子代理、沙箱执行、长期记忆、技能扩展,可完成从几分钟到几小时的复杂任务。本文深度解析架构设计、安装实战、技能系统,并附上独家配置指南。
python framebuffer gui_基于Framebuffer的嵌入式GUI系统实现
是否采用C/S客户服务机制,决定于用户的设计需求和实时性考虑。当实时能力能够得到满足时,类X的GUI在系统健壮性和功能完备性上要大大超过非 X的GUI。非X GUI往往采用单进程多线程,所有数据和操作共享同一内存区域,当某个线程出现错误时容易造成整个进程瘫痪,因此用于复杂场合的成熟的GUI大多数都采用类X GUI多进程多客户单服务的机制。由于类X的嵌入式GUI具有应用普遍性,我们采用了类X GUI...
AI漫剧制作全流程零基础实操指南:从剧本到剪辑
AI漫剧是一种利用AI工具将剧本、分镜、出图、配音、剪辑整合为流水线的短视频内容形式。其技术原理基于文生图、图生图与文本转语音模型的组合,核心挑战在于角色一致性控制与分镜批量出图。这项技术大幅降低了视频制作门槛,使个人创作者无需演员和设备即可产出剧情向短内容,广泛应用于短视频平台的情景剧、玄幻、甜宠等题材。本文给出了一套零基础可照做的全流程实操方案,覆盖剧本提示词、分镜表、出图选型、配音合成与剪辑模板,帮助你快速跑通AI漫剧制作链路。
适合嵌入式开发的GUI(嵌入式学习)
平台特定的API和框架:原生开发使用平台特定的API和框架,如Windows CE的.NET Compact Framework、Android的Android SDK等。它支持主流的操作系统,如Windows、macOS、Linux,以及嵌入式系统,如嵌入式Linux、Windows Embedded和Android等。对于嵌入式系统的GUI开发,原生开发通常涉及使用特定的编程语言和开发工具,以便直接与底层硬件和操作系统进行交互。这些工具和框架提供了丰富的功能和组件,加快了GUI开发的速度。
芯片封装、功率密度提升及热管理系统优化三个维度分析高功率芯片散热技术挑战
本文探讨高功率芯片散热技术挑战与创新。随着新能源汽车MOSFET用量增至400颗/车,文章聚焦封装技术创新(双面散热、集成模块)、功率密度提升(SGT-MOSFET优化)和热管理系统协同优化三大方向。通过热仿真案例(如CPO散热优化)展示温升改善方案,强调需协同器件级设计、系统级仿真与先进封装技术(混合键合/玻璃基板)来解决高密度互连与散热矛盾,为功率密度跃升提供技术支撑。
YOLO模型使用jupyterlab的方式进行预测/推理(示例)
首先相信很多使用过python的人都或多或少地了解过这个应用。是一个开源Web应用程序,可让用户创建和共享包含实时代码、公式、可视化和叙述文本的文档。用途包括:数据清理和转换、数值模拟、统计建模、等等。而Jupyter Lab则是Jupyter的下一代笔记本界面。是一个基于Web的交互式开发环境,用于Jupyter notebook、代码和数据。非常灵活,可支持数据科学、科学计算和机器学习领域的广泛工作。是可扩展和模块化的,其可编写插件来添加新组件并与现有组件相集成。
当前主流的小型嵌入式GUI有哪些?
关注「嵌入式大杂烩」,选择「星标公众号」一起进步!来源 |安富莱TouchGFXTouchGFX以界面华丽,流畅以及强劲的TouchGFX Designer著称。官方地址:❝https:...
西门子WinCC VBS脚本实战:5分钟搞定变量记录导出到Excel(附完整代码)
本文提供了一套高效的西门子WinCC VBS脚本方案,帮助工程师在5分钟内将变量记录数据导出至Excel。方案详细解析了时区转换、数据库连接、SQL查询优化等核心难点,并附带了完整、可直接使用的VBS代码,解决了工业自动化项目中数据导出的实际痛点。
自制嵌入式GUI 第4篇
自制GUI前1-3篇:https://blog.csdn.net/shungry/article/details/78573355 自制GUI第5篇:https://blog.csdn.net/shungry/article/details/85246023 ———————————————————————分割线———————————————————...
使用VLC库实现视频播放器(WPF版)
使用wpf制作一个视频播放器 一、 LibVLCSharp介绍 LibVLCSharp是基于VideoLAN的LibVLC库的.NET平台的跨平台音频和视频API。它提供了一个全面的多媒体API,可以跨移动、服务器和桌面使用,以呈现视频和输出音频。支持Mono、.NET Framework和.NET核心运行时。在vs工具中,只需要安装截图中得两个nuget包。 二、视频播放器的实现 视频播放器的实现需要用到两个比较nuget包中提供的类,MediaPlayer类。MediaPlayer类型用于控
诊断数据库ODX标准协议ISO22901定义组成部分
综上所述,简略描述了ODX数据库中UML/XML/Text/Check rules具体功能以及详细内容。
嵌入式GUI FTK设计与实现-事件源(FtkSource)
嵌入式GUI FTK设计与实现-事件源(FtkSource)
代谢组数据分析(十五):基于python语言构建PLS-DA分类预测模型
本教程阐述典型代谢组学数据分析工作流程,用于二元分类结果的研究。流程主要步骤如下:首先从 Excel 表格导入代谢物与实验数据,接着基于汇总 QC 进行数据清洗。随后借助主成分分析可视化检查数据质量,再开展两类单变量统计。之后运用偏最小二乘判别分析(PLS - DA)实施多变量分析,此过程涵盖模型优化(对比 R2 与 Q2)、置换测试及明确模型预测指标、确定特征重要性、对模型预测数据进行可视化。最终将统计表格导出至 Excel 表格,完整呈现从数据导入到分析结果输出的全过程。
嵌入式GUI FTK设计与实现-目录
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 总体介绍 1.FTK的三项基本原则 2.GUI的几种常见模型 3.FTK的分层视图基本框架 1. 主循环 2. 事件源 3. 显示设备
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
嵌入式GUI FTK设计与实现-三项基本原则
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 记得X Window在设计初期就提出了七项基本指导原则,在后面X Window几十年的演变过程中,都以这些基本原则作为指导思想。其中给我印象比较深的一条就是:提供机制而不是策略。X Window一
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
嵌入式GUI ftk-0.1发布
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
GUI库推荐--嵌入式GUI ftk
FTK类似microwindows,深圳的牛人开发的一个嵌入式GUI ftk 其中lua界面绑定,XUL,FB backend三个特性是我有想法去做却一直懒得动手做的三个方向。 2010.2.3开始读代码 http://blog.csdn.net/absurd/archive/2010/02/02/5279277.aspx 2010.2.7移植到VS200
RT-Thread上移植FTK GUI框架:从Win32模拟到嵌入式实战
嵌入式图形用户界面(GUI)开发是提升产品交互体验的关键技术,其核心在于如何在资源受限的微控制器(MCU)上实现稳定、高效的图形渲染与事件处理。GUI框架通过封装底层绘图、窗口管理和事件驱动机制,为开发者提供高级API,从而简化复杂界面的构建过程,其技术价值在于大幅降低开发门槛、加速产品迭代。在实时操作系统(RTOS)环境中,GUI框架需要与任务调度、内存管理及设备驱动紧密协同,以确保界面的流畅响应。常见的应用场景包括智能家居面板、工业HMI、穿戴设备等交互界面。本文聚焦于将轻量级开源GUI框架FTK(Fa
嵌入式GUI FTK 界面设计器
嵌入式GUI FTK 界面设计器 转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 微博:http://weibo.com/2352470455/profile UI Design
嵌入式GUI ftk-0.1发布 嵌入式GUI FTK 界面设计器 | 李先静的博客
嵌入式GUI ftk-0.1发布 分类: 嵌入式GUI FTK 转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 FTK最初是《系统程序员成长计划》的综合练习项目,在一些热心朋友的帮助下,从国庆到元旦,经过三个月的开发和完善,终于实现基本功能,初具现代嵌入式GUI的轮廓了。新年
嵌入式GUI FTK设计与实现-分层视图
转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 为了从整体上把握FTK的架构,我们先看看FTK的分层视图:这里我们从下至上的来介绍一下各个组件的功能:1.最下层是平台相关的适配层。它包括两个部分: * 操作系统
嵌入式GUI RT-THREAD/FTK-0 6发布
嵌入式GUI RT-THREAD/FTK-0 6发布
嵌入式GUI FTK设计与实现-分层视图(转)
嵌入式GUI FTK设计与实现-分层视图从 The linux mobile development 作者:李先静为了从整体上把握FTK的架构,我们先看看FTK的分层视图:这里我们从下至上的来介绍一下各个组件的功能:1.最下层是平台相关的适配层。它包括两个部分: * 操作系统适配层:它主要是封装平台相关的函数,为上层提供
1712



被折叠的 条评论
为什么被折叠?



