您尚未登录。

楼主 #1 2020-04-13 17:16:19

TANK
会员
注册时间: 2020-04-02
已发帖子: 12
积分: 12

littlevgl界面怎样循环点亮led灯

在一个界面上显示了4个LED灯,可以用代码点亮或点灭。

现在想每次只点亮一个,动画的话每次只能在两种界面之间切换,那么循环点亮需要创建4个动画,我想最好能用for循环加延时函数实现,但是littlevgl+VS模拟器似乎不支持延时函数,使用Windows的延时函数Sleep()会将整个界面延时加载,求问有什么好的实现方法?

离线

#2 2020-04-13 17:20:46

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,133
积分: 1085.5

Re: littlevgl界面怎样循环点亮led灯

UI线程里不能用delay的。要用timer,弄个状态机

离线

楼主 #3 2020-04-13 17:46:47

TANK
会员
注册时间: 2020-04-02
已发帖子: 12
积分: 12

Re: littlevgl界面怎样循环点亮led灯

达克罗德 说:

UI线程里不能用delay的。要用timer,弄个状态机

timer怎么弄?我试了下用for循环去循环读取Windows的时间,但也是等待for循环执行结束后才加载整个界面

离线

#4 2020-04-13 18:45:52

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,133
积分: 1085.5

Re: littlevgl界面怎样循环点亮led灯

TANK 说:

timer怎么弄?我试了下用for循环去循环读取Windows的时间,但也是等待for循环执行结束后才加载整个界面

对,因为这还是UI线程,你停在这里的时候,UI就不能执行别的操作。不光是这个llvgl,PC上界面也是的。
定一个定时器,比如100ms周期。动画总长1秒,所以把你的动画分成10个状态:
(idle,LED1 On,LED1 OFF, LED2 On, LED2 OFF。。。)
在定时响应函数里每个状态干一个事情就好。
因为你每次干的事情比较短,马上就干完回到UI了,就不会阻塞UI刷新了。

我不熟悉lvgl,具体timer 怎么定义你要去查资料了。

离线

楼主 #5 2020-04-14 16:10:24

TANK
会员
注册时间: 2020-04-02
已发帖子: 12
积分: 12

Re: littlevgl界面怎样循环点亮led灯

达克罗德 说:

对,因为这还是UI线程,你停在这里的时候,UI就不能执行别的操作。不光是这个llvgl,PC上界面也是的。
定一个定时器,比如100ms周期。动画总长1秒,所以把你的动画分成10个状态:
(idle,LED1 On,LED1 OFF, LED2 On, LED2 OFF。。。)
在定时响应函数里每个状态干一个事情就好。
因为你每次干的事情比较短,马上就干完回到UI了,就不会阻塞UI刷新了。

我不熟悉lvgl,具体timer 怎么定义你要去查资料了。


感谢回复,我用lvgl自带的任务函数,把LED灯的循环放在周期任务中就好了。

离线

#6 2020-04-15 01:09:22

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,133
积分: 1085.5

Re: littlevgl界面怎样循环点亮led灯

TANK 说:

感谢回复,我用lvgl自带的任务函数,把LED灯的循环放在周期任务中就好了。

跨线程操作UI有点危险的,不过你的任务简单,可能也没问题

离线

楼主 #7 2020-04-22 10:04:02

TANK
会员
注册时间: 2020-04-02
已发帖子: 12
积分: 12

Re: littlevgl界面怎样循环点亮led灯

达克罗德 说:

跨线程操作UI有点危险的,不过你的任务简单,可能也没问题

感谢,今天还真就遇到这个问题了,单开任务处理LED动画时,相当于一个独立于界面的线程在执行,切换界面后,这个任务仍在执行,导致另一个界面加载会崩溃,切换界面后删除LED动画任务就好了。

离线

#8 2020-04-22 10:08:08

湘楚浪子
会员
注册时间: 2019-12-22
已发帖子: 40
积分: 39.5

Re: littlevgl界面怎样循环点亮led灯

至今没有一个UI(包括macos,windows,android)支持跨线程操作,基本模式都是通过通讯(如消息)机制通知主线程统一更新UI.

离线

#9 2020-04-22 14:01:26

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,133
积分: 1085.5

Re: littlevgl界面怎样循环点亮led灯

湘楚浪子 说:

至今没有一个UI(包括macos,windows,android)支持跨线程操作,基本模式都是通过通讯(如消息)机制通知主线程统一更新UI.

是的,UI库一般不是线程安全的。如果逻辑简单,像楼主这样简单的例子小心点还是可以的。
llvgl不提供UI线程的定时器吗?UI定时器里肯定可以实现

离线

页脚

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

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