@21小跑堂 #申请原创
1、技术问题
最近工作遇到过需求,板子外接到按键,通过内核的input子系统将按键事件上报到应用程序。
大概监控了十几个按键,通过多路复用监控了所有的按键,使用正常。
但是,如果快速按下放开,通过日志能够看到应用层得到事件的顺序是对的,事件很靠近。但是应用层处理的顺序是错乱的。先处理了释放事件,再处理按下事件。就导致绘制屏幕乱七八糟的。
2、解决方案
问题原因:是因为事件太近,系统调度是不确定的,不是严格按照我事件得到的顺序调度的,就造成了这个问题。
解决方法:修改线程的调度策略和调度优先级。
首先配置线程的调度策略为FIFO,调度优先级为2即可,不用太高。
最重要的是要解除继承父线程的线程属性。
linux的新线程默认是继承父线程的线程属性,如不解除父子线程属性的继承,则会导致配置线程调度策略和优先级会失败。
后续改完,证明效果良好。
不用担心优先级调高影响其他程序的性能,因为事件读取很快,丢给其他任务继续任务。读取按键事件的任务线程会继续读取,若无事件,就会睡眠,不会占用cpu时间片,不影响系统性能。
|