当前位置: 首页 > news >正文

LVGL应用和部署(多线程异步通信)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

在开发界面的时候,有一种情况是肯定会发生的,那就是异步通信。大家都知道,lvgl本身运行是独立运行的一个thread,但是linux下面一个程序不大可能只有一个thread。在这种情况下,其他线程如何给lvgl发消息,更新里面的状态呢?

1、直接处理控件是否可行

一个linux程序里面,除了lvgl,可能还有一些外部硬件需要处理。比如说按键,后台就需要不停轮询,检测哪些按键被按下去了,哪些按键抬起来。等到按键抬起来的时候,就会trigger一个按钮事件,发送给lvgl里面的控件。这种情况下,是否可以直接处理lvgl控件呢?

2、lvgl内部不支持多线程保护

lvgl本身是非常轻量的图形界面库,它除了适配linux,还适配mcu等很多小的处理器。这些小的处理器上面,很多时候是没有操作系统的,所以也就谈不上锁这类工具。因此假设在linux上面运行lvgl,其他线程要操作lvgl里面的对象,是不可以直接操作的,因为一旦操作,就可能遇到不可想象的后果。

3、自定义消息的模式

这种模式是目前为止最合理的模式。一方面按键需要轮询,另外一方面又不能对lvgl里面的控件直接处理。此时最好的方法,就是设计一个状态机,判断当前处于哪个子窗口,然后把子窗口和对应的消息通过队列的形式,发送给lvgl线程,让lvgl自己来处理,这样就不会涉及到多线程访问的问题。只不过,这种方式稍显麻烦一点,需要自己维护一个消息队列,大家未必乐意这么去做。

4、异步调用lv_async_call

从lvgl 8.x版本出现之后,系统出现了一个好用的api,那就是lv_async_call函数。也就是说其他线程如果需要对lvgl进行数据更新,那么直接调用这个函数就可以了。函数本身有两个参数,一个是函数指针,一个是对应函数的参数,供函数内部使用。大多数情况下,这些函数指针都会写成匿名函数的形式。这也就是lv_async_call的由来。

从字面意义上,也可以分析所谓异步调用的本质是什么,那就是外部线程不直接更新lvgl线程的内容,而是把函数指针和数据发送给lvgl线程,等lvgl在合适和恰当的时候来处理这部分数据。这就是异步的含义所在。

5、函数参数是最大的危险

看上去lv_async_call很完美解决了不同线程更新lvgl控件的问题,但是这里面潜藏一个很大的危险,那就是lv_async_call第二个参数指针的问题。大多数时候lv_async_call就是把消息push到某个队列里面,立马就返回了。所以这个时候,发送出去的lv_async_call数据参数千万不能是局部变量,只能是全局变量。因为这个指向的数据参数,假设是某个堆栈变量,则很容易被改写。一旦被改写,就有可能出现意想不到的结局,到时候调试起来就麻烦了。

http://www.cnnetsun.cn/news/79514.html

相关文章:

  • LangFlow支持异步任务处理,提升AI响应速度
  • JELOS:专为掌机打造的轻量级Linux操作系统
  • spark的统一内存管理机制
  • 终极方案:巧用PVC与StorageClass彻底解决Hadoop在K8s的存储难题
  • 8、算法与数据结构实用案例解析
  • palera1n越狱终极指南:从零开始解锁iOS设备完整教程
  • GLM-4-32B-0414:重塑智能体技术栈的推理引擎革命
  • 终极色彩生成器:一键打造完美配色方案
  • Blender版本管理技巧:从新手到高手的全流程指南
  • F5-TTS移动端部署终极指南:5大技巧实现70%内存优化与性能飞跃
  • DataX Web UI:企业数据同步的终极可视化解决方案
  • 系统可观测性实战指南:从混乱日志到智能洞察的架构进化
  • 分布式训练终极指南:同步与异步策略深度解析
  • 一根同轴线,真的扛得住 4K 吗? ——从摄像头带宽算起,聊透车载 SerDes 接口选型
  • 掌握质谱分析:OpenMS完整使用指南与实战技巧
  • CloudStream智能文件管理:告别杂乱无章的媒体库
  • CopyQ剪贴板管理终极指南:3个核心技巧打造高效工作流
  • Linly-Talker数字人系统对网络带宽的要求分析
  • ExoPlayer状态恢复:如何让视频播放器记住你的“续播点“?
  • MSBuild BuildCheck框架:构建质量革命与团队效率提升终极指南
  • Wechaty智能消息处理全攻略:告别单一回复,实现多场景精准响应
  • Langchain-Chatchat在企业知识管理中的5大应用场景
  • Arkime性能监控完整教程:构建企业级流量分析平台
  • 秒开体验:SmartTube视频缩略图加载与缓存优化实战
  • 20、GNU Make标准库函数详解
  • 21、GNU Make 标准库实用功能与使用技巧详解
  • HyperLPR3实战指南:快速搭建高精度车牌识别系统
  • 当AI患上“健忘症“:MemGPT如何用AWS Bedrock Claude打造过目不忘的智能助手
  • SmartTube视频缩略图优化:3大策略让加载速度提升5倍
  • Excalidraw GitHub Actions工作流配置示例