news 2026/5/11 17:40:27

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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数据参数千万不能是局部变量,只能是全局变量。因为这个指向的数据参数,假设是某个堆栈变量,则很容易被改写。一旦被改写,就有可能出现意想不到的结局,到时候调试起来就麻烦了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 16:46:43

Springboot信息学院智慧学情管理系统umsft(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:学生,教师,辅导员,学院政策,奖项荣誉,学生成绩,处分情况,推免情况分析,预警情况分析,班级学情,专业学情,年级学情,导师带教学生学情开题报告内容一、研究背景与意义(一)研究背景随着信息技术的迅猛发展和教育管理的…

作者头像 李华
网站建设 2026/5/11 12:38:07

Dify循环节点反复调用Anything-LLM直到满足终止条件

Dify循环节点反复调用Anything-LLM直到满足终止条件 在企业知识管理日益复杂的今天,用户对智能问答系统的期待早已超越“问一句答一句”的初级模式。越来越多的业务场景要求系统不仅能理解问题,还要能主动追问、持续验证、逐步逼近准确答案——比如法务人…

作者头像 李华
网站建设 2026/5/1 21:09:06

3步彻底解决Prisma版本冲突:从报错到稳定部署的完整指南

3步彻底解决Prisma版本冲突:从报错到稳定部署的完整指南 【免费下载链接】prisma Next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, SQLite, MongoDB and CockroachDB 项目地址: https://gitcode.com/GitHub_Trendin…

作者头像 李华
网站建设 2026/5/8 0:43:49

Flutter Web渲染演进:从DOM到CanvasKit的架构革命

Flutter Web渲染演进:从DOM到CanvasKit的架构革命 【免费下载链接】engine The Flutter engine 项目地址: https://gitcode.com/gh_mirrors/eng/engine 当开发者首次接触Flutter Web时,往往会面临一个关键抉择:选择HTML渲染模式还是Ca…

作者头像 李华
网站建设 2026/5/9 0:58:27

flink的barrier对齐

好的,我们来详细解释 Flink 中的 Barrier 对齐机制。这是 Flink 实现 精确一次(Exactly-Once) 状态处理语义的核心技术之一,依赖于其 分布式快照(Distributed Snapshots) 算法。 1. 什么是 Barrier? 、barrier:就是一根棍,有多少个并行度 ,每一个并行度在进行快照保…

作者头像 李华
网站建设 2026/5/2 21:03:10

open_clip多模态模型实战指南:从入门到精通

open_clip多模态模型实战指南:从入门到精通 【免费下载链接】open_clip An open source implementation of CLIP. 项目地址: https://gitcode.com/GitHub_Trending/op/open_clip open_clip作为CLIP模型的开源实现,提供了强大的多模态AI能力&#…

作者头像 李华