更多内容请访问:Harmonyos.51cto.com/#zz我讲解了DTButton-V0.0.1的设计思路在上一篇文章《实现按键“按下事件”和“释放事件”的通用框架(V0.0.1)》中,也在文章中开源了实现代码。实现这个框架的用意很明显,就是为了偷懒,想响应按键事件的时候,一行代码就搞定了。正是因为我就是想偷懒,所以V0.0.1版本的实现非常简单粗暴:快速实现功能即可,其他问题暂且不管。核心实现代码如下:可能有同学会说:这个实现有什么问题吗?看起来有理有据,用起来也没有问题!是的!从功能实现的角度来说,这是最简单的方式,代码量最少,可用即用。不过大家也需要注意:OnButtonPressed()和OnButtonReleased()是在中断上下文中调用的!所以这两个函数一定要快速返回,不能做太多繁重的工作。但是作为一个框架,这两个中断函数必须调用相应的回调函数。..这种情况下,要求传入的回调函数一定要短小精悍,不要太繁琐!!因此,V0.0.1版本实现的短板就凸显出来了:当按钮被按下时,需要做的处理必须足够简单。如果比较复杂繁琐,可能会导致系统中断响应不及时,进而导致系统PANIC重启!!!(如果不明白中断的概念,可以自己查相关资料,也可以看看我的操作系统视频课程。)那么有什么办法可以解决呢?这个问题怎么办?当然有办法!!由于V0.0.1版本的问题与中断响应有关,可以借鉴Linux内核中的原理和解决方法:中断服务程序执行得越快越好,中断处理分为两部分:中断处理上半部分和中断处理下半部分。说明:中断发生后,需要立即调用中断服务程序进行中断处理。如果直接在中断服务程序中进行这个处理,处理速度一定要越快越好!但是,肯定有一些情况是处理步骤比较耗时复杂的,这种情况下,可以先标记要完成的处理工作(打断上半部分),具体的处理步骤会在中断服务程序返回(中断下半部分)。是不是感觉很抽象,看不懂?!没关系,我们会通过V0.0.2版本的设计和实现来为大家讲解这个方案。上图中的例子是DTButton-V0.0.2的核心实现,现在感觉应该很简单了。嘿!因为是通用框架,所以最终的代码实现需要考虑的东西很多,比上图的例子要复杂。现在,这个框架相比之前的版本有了很大的提升,而且还有专门的事件处理线程!正是因为创建了这个线程,才不能浪费,必须多用。那你还能用它做什么???想一想,现在可以捕获按钮的按下事件和释放事件了!!那么,如果新闻事件和发布事件之间的时间间隔比较长,那么我们是否可以“创造”一个全新的长新闻事件???答案是肯定的!按下事件发生后,可以通过事件处理线程进行粗略的计时。当计时超过预设时间间隔(约2.5秒)时,即可触发长按事件,具体表现为长按事件回调函数的调用。这里注意:1、长按事件只会触发一次,即OnButtonLongPressed()回调函数只会被调用一次2、释放事件触发时需要停止计时,即时间间隔按下事件和释放事件之间小于2.5秒不会触发长按事件有了上面的分析,大家可以自己尝试实现一下。什么?你觉得麻烦吗?没有什么!实现代码我已上传到文末附件。您可以下载、使用和学习它。非常欢迎您提出意见和建议。使用示例如下:1.定义按键事件回调函数2.一键注册,开箱即用运行结果如下:后记:开箱使用后相信有的同学发现问题了:GPIO_5居然对应Hi3861Button上的3个physics!!!!如何解决?嗯,这就是DTButton-V0.0.3将要解决的问题!希望大家关注这个框架,我会尽自己最大的努力去开发、维护和完善!更多信息请访问:与华为官方共同建立的鸿蒙技术社区https://harmonyos.51cto.com/#zz
