您尚未登录。

楼主 # 2024-01-17 14:52:47

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

LVGL的事件处理函数的添加和删除的API好丑呀

我最近启动了一个项目:实现一个应用于嵌入式的声明式UI框架: https://gitee.com/ufbycd/zdec
用Zig语言编写,底层基于LVGL进行绘图。我用过emWin、AWTK、QT(widget/qml/pyqt)、 wxWidgets,但我之前对LVGL只是耳闻并在PC上跑了下Demo,实际项目从来没用过。
在实现命令绑定时发现LVGL的事件处理函数的添加和删除的API好丑呀。
lv_obj_add_event_cb的返回值在V8版本已经标记为遗弃。而在V9版本则没有返回值了,API调用到底是成功还是失败,用户不知道!太不严谨了。
并且不能通过lv_obj_add_event_cb返回的东西来删除处理函数了。这对于实现一个声明式UI框架很不友好!

AWTK相应的API是这样的:

uint32_t widget_on(widget_t* widget, uint32_t type, event_func_t on_event, void* ctx);
ret_t widget_off(widget_t* widget, uint32_t id);

用法是这样的:

// 添加
uint32_t event_id = widget_on(widget, EVT_CLICK, callback, ctx);
if(event_id == TK_INVALID_ID) {
    // 失败处理
}

// 删除
widget_off(widget, event_id);

LVGL的版本号都这么大了,大家都没有意见吗?我打算到github上提下意见。
另外,将来空闲时也会写点这个Zig项目的心得。

最近编辑记录 海石生风 (2024-01-17 15:13:23)

离线

#1 2024-01-17 19:07:04

ktouch
会员
注册时间: 2023-11-27
已发帖子: 18
积分: 3

Re: LVGL的事件处理函数的添加和删除的API好丑呀

LVGL总体还是很不错的,生态好,开源免费,代码风格也是很不错的

离线

楼主 #2 2024-01-18 13:29:50

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

Re: LVGL的事件处理函数的添加和删除的API好丑呀

LVGL的版本号为什么飙得这么快,是因为新版API跟旧版的不兼容,那为什么会经常不兼容呢?
我个人认为,除了用LVGL的人越来越多导致需求变化很大之外,有些API考虑不够周全导致稳定不下来。

离线

楼主 #3 2024-01-26 18:17:38

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

Re: LVGL的事件处理函数的添加和删除的API好丑呀

LVGL v9.0.0正式发布了,看了下changelog,API改动挺多。
这让刚刚启动zlvgl项目的API绑定选择哪个版本才好?

离线

#5 2024-01-27 09:16:23

regbbs
会员
注册时间: 2020-04-06
已发帖子: 80
积分: 67.5

Re: LVGL的事件处理函数的添加和删除的API好丑呀

海石生风 说:

LVGL v9.0.0正式发布了,看了下changelog,API改动挺多。
这让刚刚启动zlvgl项目的API绑定选择哪个版本才好?

新搞的都行,先选择新版本是肯定的,V9和V8的API很多变化的太大了,不光是名称,参数也有很多变化,也删除了不少函数。

离线

#6 2024-01-27 17:48:35

david
会员
注册时间: 2018-03-05
已发帖子: 388
积分: 319.5

Re: LVGL的事件处理函数的添加和删除的API好丑呀

lvgl的意思是lv_obj_add_event_cb就是列表里加个函数指针 根本不会 fail 不过列表如果静态的会不会占好大地方 如果动态满了怎么办

离线

楼主 #7 2024-01-27 19:01:06

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

Re: LVGL的事件处理函数的添加和删除的API好丑呀

david 说:

lvgl的意思是lv_obj_add_event_cb就是列表里加个函数指针 根本不会 fail 不过列表如果静态的会不会占好大地方 如果动态满了怎么办

lv_obj_add_event_cb内部会有动态内存分配,只有一个fail原因,那就是内存分配失败。
后面看了不少C代码,lvgl对于内存分配失败都是只用LV_ASSERT_MALLOC触发断言而没有在返回值上体现来处理的,跟我之前所用的UI库处理习惯上有点不同。

而zig这边因为有完善的错误处理机制,一个函数返回OOM(Out Of Memory)错误是很常见的。zig提倡由调用者决定什么时候处理错误,这就可以让软件更健壮,不会一触发OOM就因ASSERT断言而死掉。

最近编辑记录 海石生风 (2024-01-27 19:03:58)

离线

#8 2024-01-28 02:09:32

Quotation
会员
注册时间: 2018-10-04
已发帖子: 296
积分: 264.5

Re: LVGL的事件处理函数的添加和删除的API好丑呀

继续用旧版就挺好,满足需求。

离线

楼主 #9 2024-01-28 15:15:56

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

Re: LVGL的事件处理函数的添加和删除的API好丑呀

Quotation 说:

继续用旧版就挺好,满足需求。

我想了下,可以这样:以V9的API风格去绑定V8。绑定其实就是加一层封装,更换lvgl版本就是更改封装的内部实现。这样以后将绑定从V8迁移到V9从外面看就没什么变更。

最近编辑记录 海石生风 (2024-01-28 15:16:25)

离线

#10 2024-01-28 18:09:42

david
会员
注册时间: 2018-03-05
已发帖子: 388
积分: 319.5

Re: LVGL的事件处理函数的添加和删除的API好丑呀

断言是不是更好些 近似于exception机制

离线

楼主 #11 2024-01-28 18:31:57

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

Re: LVGL的事件处理函数的添加和删除的API好丑呀

david 说:

断言是不是更好些 近似于exception机制

断言完全就跟exception不一样吧!断言一触发,程序就进入死循环,调用者没有任何控制能力,即程序就会立即死掉。
而exception,如果调用者catch到异常就不会使程序死掉。
zig、rust的错误处理才是近似exception,但更简洁、更高效。

离线

#12 2024-01-29 17:17:44

david
会员
注册时间: 2018-03-05
已发帖子: 388
积分: 319.5

Re: LVGL的事件处理函数的添加和删除的API好丑呀

机理肯定是不一样的 不过 你也可以把断言改成弹出个消息框或者标记全局错误状态 不用一条一条检查函数返回值 嵌入式的内存不够了 程序和用户能做的事情不多 也就是获得错误消息转给开发人员处理

离线

楼主 #13 2024-01-29 22:21:40

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 650
积分: 783
个人网站

Re: LVGL的事件处理函数的添加和删除的API好丑呀

david 说:

机理肯定是不一样的 不过 你也可以把断言改成弹出个消息框或者标记全局错误状态 不用一条一条检查函数返回值 嵌入式的内存不够了 程序和用户能做的事情不多 也就是获得错误消息转给开发人员处理

消息框弹出来了,然后呢,你原本的流程怎么办?标记了全局错误状态也要每层都去判断是否出错呀,不然你的流程怎么办,出错了也照常走?

zig的错误处理不需要像go那样每返回一个错误就检查一次,zig在调用函数时加try关键字就可以在出错时直接返回错误,而没有出错时就照常走。

在可靠性要求高的场合,即使出现OOM错误也不能让程序直接死掉的。

最近编辑记录 海石生风 (2024-01-29 22:29:26)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn