新聞中心
想了解更多內(nèi)容,請?jiān)L問:

公司主營業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出安州免費(fèi)做網(wǎng)站回饋大家。
和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos./#zz
我在之前的帖子《實(shí)現(xiàn)按鍵“按下事件”和“釋放事件”的通用框架(V0.0.1)》中闡述了DTButton-V0.0.1的設(shè)計(jì)思路,并且也在帖子中開源了實(shí)現(xiàn)代碼。
實(shí)現(xiàn)這個(gè)框架的意圖非常明顯,就是為了偷懶,想要響應(yīng)按鍵事件的時(shí)候可以一行代碼搞定。也正是因?yàn)橹幌胪祽校琕0.0.1版本在實(shí)現(xiàn)上非常的簡單粗暴:快速實(shí)現(xiàn)功能即可,其它問題暫時(shí)不考慮。
核心實(shí)現(xiàn)代碼如下:
有同學(xué)可能會(huì)說:這樣實(shí)現(xiàn)有什么問題嗎?看起來合情合理,用起來也沒問題啊!
是的!從功能實(shí)現(xiàn)角度,這樣做是最簡單的,代碼量最少,能立即可用。然而,大家也需要意識到:OnButtonPressed() 和 OnButtonReleased() 是在中斷上下文中調(diào)用的!因此,這兩個(gè)函數(shù)必須快速返回,不能做過于繁重的工作。但是作為框架,這兩個(gè)中斷函數(shù)又必須調(diào)用相應(yīng)的回調(diào)函數(shù)。。。這樣子的話,就要求傳入的回調(diào)函數(shù)必須短小精悍,不能過于繁瑣!!于是,V0.0.1版本的實(shí)現(xiàn)短板就凸顯了:當(dāng)按鍵按下后需要做的處理必須足夠簡單,如果比較復(fù)雜和繁瑣,就可能造成系統(tǒng)中斷響應(yīng)不及時(shí),進(jìn)而導(dǎo)致系統(tǒng)PANIC重啟!!!(如果不了解中斷的概念,可自行查閱相關(guān)資料,也可以看看我的操作系統(tǒng)視頻課程。)
那么有沒有辦法解決這個(gè)問題呢?
辦法當(dāng)然是有的!!既然V0.0.1版本的問題和中斷響應(yīng)相關(guān),那么可以借鑒Linux內(nèi)核中的原則和方案:中斷服務(wù)程序的執(zhí)行越快越好,將中斷處理分為兩部分:中斷處理上半部和中斷處理下半部。
解釋:
中斷發(fā)生后需要立即調(diào)用中斷服務(wù)程序進(jìn)行中斷處理,如果直接在中斷服務(wù)程序中做這個(gè)處理,那么處理速度必須越快越好!
但是,肯定有一些情況的處理步驟是比較耗時(shí)和復(fù)雜的,在這種情況下,就可以先把要做的處理工作進(jìn)行標(biāo)記(中斷上半部),具體處理步驟在中斷服務(wù)程序返回后再完成(中斷下半部)。
是不是感覺很抽象,理解不了了?! 沒關(guān)系,我們通過V0.0.2版本的設(shè)計(jì)實(shí)現(xiàn)給大家講解這個(gè)方案。
上圖中的示例就是DTButton - V0.0.2的核心實(shí)現(xiàn),現(xiàn)在應(yīng)該感覺很簡單了吧。嘿嘿!因?yàn)槭峭ㄓ每蚣埽宰罱K的代碼實(shí)現(xiàn)要考慮的東西很多,比上圖中的示例看起來要復(fù)雜些。
現(xiàn)在,這個(gè)框架比起上一個(gè)版本有了很大的改進(jìn),并且還擁有了專用的事件處理線程!也正是因?yàn)閯?chuàng)建了這個(gè)線程,所以不能浪費(fèi)啊,必須多多利用才行。
那么還能用它來干點(diǎn)啥呢???
大家想想,現(xiàn)在能夠捕捉到按鍵的按下事件和釋放事件了!!
那么,如果按下事件和釋放事件之間的時(shí)間間隔比較長,那么是不是我們就可以“創(chuàng)造“一個(gè)全新的長按事件呢???
答案是肯定的!
按下事件發(fā)生后,可以通過事件處理線程進(jìn)行粗略計(jì)時(shí),當(dāng)計(jì)時(shí)超過預(yù)設(shè)的時(shí)間間隔(大概2.5秒),即可觸發(fā)長按事件,具體表現(xiàn)為長按事件回調(diào)函數(shù)的調(diào)用。
這里需要注意:
1. 長按事件只會(huì)觸發(fā)一次,即:OnButtonLongPressed() 回調(diào)函數(shù)只會(huì)調(diào)用一次
2. 釋放事件觸發(fā)時(shí)需要停止計(jì)時(shí),即:按下事件和釋放事件之間的時(shí)間間隔不足2.5秒就不會(huì)觸發(fā)長按事件
有了上面的分析,大家就可以自己嘗試動(dòng)手實(shí)現(xiàn)了。
什么?覺得麻煩?
沒事!我已經(jīng)將實(shí)現(xiàn)代碼上傳到了文末的附件中,大家可以下載使用和研究,非常歡迎大家的意見和建議。
使用示例如下:
1. 定義按鍵事件回調(diào)函數(shù)
2. 一鍵注冊,開箱即用
運(yùn)行結(jié)果如下:
后記:
開箱使用之后,相信已經(jīng)有同學(xué)發(fā)現(xiàn)了問題:GPIO_5居然對應(yīng)了Hi3861上的 3 個(gè)物理按鍵!!!!
怎么解決?
嗯,這是 DTButton - V0.0.3 中會(huì)重點(diǎn)解決的問題!
希望大家關(guān)注這個(gè)框架,我會(huì)盡力開發(fā),維護(hù)和完善它!
想了解更多內(nèi)容,請?jiān)L問:
和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos./#zz
網(wǎng)站題目:鴻蒙實(shí)現(xiàn)物理按鍵的“長按事件”(按鍵通用框架V0.0.2)
文章出自:http://www.5511xx.com/article/cdopepd.html


咨詢
建站咨詢
