在一个界面上显示了4个LED灯,可以用代码点亮或点灭。
现在想每次只点亮一个,动画的话每次只能在两种界面之间切换,那么循环点亮需要创建4个动画,我想最好能用for循环加延时函数实现,但是littlevgl+VS模拟器似乎不支持延时函数,使用Windows的延时函数Sleep()会将整个界面延时加载,求问有什么好的实现方法?
离线
UI线程里不能用delay的。要用timer,弄个状态机
离线
UI线程里不能用delay的。要用timer,弄个状态机
timer怎么弄?我试了下用for循环去循环读取Windows的时间,但也是等待for循环执行结束后才加载整个界面
离线
timer怎么弄?我试了下用for循环去循环读取Windows的时间,但也是等待for循环执行结束后才加载整个界面
对,因为这还是UI线程,你停在这里的时候,UI就不能执行别的操作。不光是这个llvgl,PC上界面也是的。
定一个定时器,比如100ms周期。动画总长1秒,所以把你的动画分成10个状态:
(idle,LED1 On,LED1 OFF, LED2 On, LED2 OFF。。。)
在定时响应函数里每个状态干一个事情就好。
因为你每次干的事情比较短,马上就干完回到UI了,就不会阻塞UI刷新了。
我不熟悉lvgl,具体timer 怎么定义你要去查资料了。
离线
对,因为这还是UI线程,你停在这里的时候,UI就不能执行别的操作。不光是这个llvgl,PC上界面也是的。
定一个定时器,比如100ms周期。动画总长1秒,所以把你的动画分成10个状态:
(idle,LED1 On,LED1 OFF, LED2 On, LED2 OFF。。。)
在定时响应函数里每个状态干一个事情就好。
因为你每次干的事情比较短,马上就干完回到UI了,就不会阻塞UI刷新了。我不熟悉lvgl,具体timer 怎么定义你要去查资料了。
感谢回复,我用lvgl自带的任务函数,把LED灯的循环放在周期任务中就好了。
离线
感谢回复,我用lvgl自带的任务函数,把LED灯的循环放在周期任务中就好了。
跨线程操作UI有点危险的,不过你的任务简单,可能也没问题
离线
跨线程操作UI有点危险的,不过你的任务简单,可能也没问题
感谢,今天还真就遇到这个问题了,单开任务处理LED动画时,相当于一个独立于界面的线程在执行,切换界面后,这个任务仍在执行,导致另一个界面加载会崩溃,切换界面后删除LED动画任务就好了。
离线
至今没有一个UI(包括macos,windows,android)支持跨线程操作,基本模式都是通过通讯(如消息)机制通知主线程统一更新UI.
离线
至今没有一个UI(包括macos,windows,android)支持跨线程操作,基本模式都是通过通讯(如消息)机制通知主线程统一更新UI.
是的,UI库一般不是线程安全的。如果逻辑简单,像楼主这样简单的例子小心点还是可以的。
llvgl不提供UI线程的定时器吗?UI定时器里肯定可以实现
离线