專利名稱:定時方法
技術領域:
本發(fā)明涉及嵌入式軟件開發(fā)領域,尤其是涉及該領域中的定時方法和裝置。
背景技術:
在軟件開發(fā)過程中,很多軟件模塊需要用到定時器?,F(xiàn)有技術中存在多種不同的操作系統(tǒng),且每個操作系統(tǒng)中的定時器均依賴于本系統(tǒng)的信號觸發(fā)及處理,并且,對于依賴本系統(tǒng)的定時器而言,每個進程中能夠使用的定時器數(shù)目是固定的,因此,定時器除受信號的限制外,還受到進程中定時器數(shù)目的限制。例如,在Linux操作系統(tǒng)中,主要使用三種定時器,分別是alarm ()、P0SIX:XSI間隔定時器setitimer (),POSIX TMR間隔定時器timer_ create (),這些定時器都建立在Linux操作系統(tǒng)的信號觸發(fā)、處理的基礎上,并且有定時器個數(shù)和信號的限制。
發(fā)明內(nèi)容
本發(fā)明提供一種定時方法,用以解決現(xiàn)有技術中存在定時器受到所在操作系統(tǒng)的信號的限制,以及每個進程中定時器數(shù)目的限制的問題,包括接收軟件模塊發(fā)送的定時器調(diào)用請求;為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進行計時;當所述被分配的定時器的計時時間到達對應的預設定時時間時,向所述軟件模塊發(fā)送定時器到時消息。較佳的,向所述軟件模塊發(fā)送定時器到時消息之后,還包括將所述被分配的定時器恢復為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。較佳的,所述利用被分配的定時器進行計時,包括獲取所述被分配的定時器的預設定時時間,并確定時鐘滴答數(shù)組中游標當前指向的第一成員,所述成員代表設定的時間長度值;根據(jù)所述預設定時時間,估測所述被分配的定時器的計時時間到達所述預設定時時間時所述游標指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;根據(jù)所述預設定時時間,預測所述游標遍歷所述時鐘滴答數(shù)組的次數(shù)N,其中,N 等于所述預設定時時間與所述時鐘滴答數(shù)組的總時長的比值向下取整;移動所述游標進行計時,當所述游標第N+1次移動到指向第二成員時,所述被分配的定時器的計時時間到達所述預設定時時間。較佳的,還包括當所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙向鏈表方式將該成員下的至少一個定時器的標識串聯(lián);在所述雙向鏈表中,每個定時器的標識對應一前置變量WPreNode和一后置變量 wNextNode,其中,所述wPreNode用于指向該標識標志的定時器的前一個定時器的標識,所述WNextNode用于指向該標識標志的定時器的后一個定時器的標識。
較佳的,還包括在已掛載至少一個定時器的成員下增加定時器時,將增加的定時器的標識放到所述雙向鏈表的表頭,利用所述增加的定時器的標識的后置變量鏈接所述雙向鏈表的原表頭對應的定時器的標識。較佳的,所述為所述軟件模塊分配定時器,包括在空閑結點表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,所述定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組的一個成員;根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應的空閑的定時器;將確定的空閑的定時器分配給所述軟件模塊。較佳的,所述空閑結點表具有指向所述空閑結點表表頭的頭變量wFreeHead和指向所述空閑結點表表尾的尾變量wFreeTail,且當所述wFreeHead和所述wFreehil指向的成員的數(shù)值均大于所述存儲數(shù)組的最大值時,設置所述WFreeHead和所述wFreeTail返回并指向所述存儲數(shù)組的第一位成員;為所述軟件模塊分配一個空閑的定時器之后,設置所述wFreeHead在所述存儲數(shù)組中后移一位;釋放一個被分配的定時器占用的資源之后,設置所述WFreeTail在所述存儲數(shù)組中后移一位。較佳的,還包括當所述被分配的定時器的計時時間未到達對應的預設定時時間時,接收定時器取消請求,通知被分配的定時器停止計時。本發(fā)明還提供了一種定時裝置,用以解決現(xiàn)有技術中存在定時器受到所在操作系統(tǒng)的信號的限制,以及每個進程中定時器數(shù)目的限制的問題,包括接收模塊,用于接收軟件模塊發(fā)送的定時器調(diào)用請求;分配模塊,用于為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進行計時;發(fā)送模塊,用于當所述被分配的定時器的計時時間到達對應的預設定時時間時, 向所述軟件模塊發(fā)送定時器到時消息。較佳的,還包括釋放模塊,用于向所述軟件模塊發(fā)送定時器到時消息之后,將所述被分配的定時器恢復為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。較佳的,所述分配模塊包括獲取子模塊,用于獲取所述被分配的定時器的預設定時時間,并確定時鐘滴答數(shù)組中游標當前指向的第一成員,所述成員代表設定的時間長度值;估測子模塊,用于估測所述被分配的定時器的計時時間到達所述預設定時時間時所述游標指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;預測子模塊,用于根據(jù)所述預設定時時間,預測所述游標遍歷所述時鐘滴答數(shù)組的次數(shù)N,其中,N為> 0的整數(shù),且N等于所述預設定時時間與所述時鐘滴答數(shù)組的總時長的比值向下取整;
計時子模塊,用于移動所述游標進行計時,當所述游標第N+1次移動到指向第二成員時,所述被分配的定時器的計時時間到達所述預設定時時間。較佳的,所述分配模塊還包括串聯(lián)子模塊,用于當所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙向鏈表方式將該成員下的至少一個定時器的標識串聯(lián);在所述雙向鏈表中,每個定時器的標識對應一前置變量wPreNode和一后置變量wNextNode,其中,所述wPreNode用于指向該標識標志的定時器的前一個定時器的標識,所述WNextNode用于指向該標識標志的定時器的后一個定時器的標識。較佳的,所述分配模塊包括查詢子模塊,用于在空閑結點表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,所述定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組的一個成員;確定子模塊,用于根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應的空閑的定時器;分配子模塊,用于將確定的空閑的定時器分配給所述軟件模塊。采用本發(fā)明,根據(jù)軟件模塊的定時器調(diào)用請求分配空閑的定時器,而不是使用所在操作系統(tǒng)自帶的定時器進行計時,當被分配的定時器的計時時間到達對應的預設定時時間時,向軟件模塊發(fā)送定時器到時消息,能夠避免了操作系統(tǒng)自帶定時器依賴于本系統(tǒng)的信號觸發(fā)及處理、受到本系統(tǒng)信號的限制,以及受到進程中定時器數(shù)目的限制,以及,不影響軟件模塊自身的信號觸發(fā)及處理,也不會影響軟件模塊正在處理的進程,避免進程執(zhí)行過程中信號突然中止的問題。
圖1為本發(fā)明實施例提供的定時方法的流程圖;圖2為本發(fā)明實施例提供的利用被分配的定時器進行計時的流程圖;圖3為本發(fā)明實施例提供的時鐘滴答數(shù)組的結構示意圖;圖4為本發(fā)明實施例提供的定時器利用時鐘滴答數(shù)組進行計時的示意圖;圖5為本發(fā)明實施例提供的雙向鏈表的結構示意圖;圖6為本發(fā)明實施例提供的定時器共享內(nèi)存的結構示意圖;圖7為本發(fā)明實施例提供的空閑結點表的結構示意圖;圖8為本發(fā)明實施例提供的定時器計時及到時后的處理流程圖;圖9為本發(fā)明實施例提供的利用空閑結點表管理空閑的定時器的流程圖;圖10為本發(fā)明實施例提供的定時器到達預設定時時間或者被取消后的處理流程圖;圖11為本發(fā)明實施例提供的第一種定時裝置的結構示意圖;圖12為本發(fā)明實施例提供的第二種定時裝置的結構示意圖;圖13為本發(fā)明實施例提供的第一種分配模塊的結構示意圖;圖14為本發(fā)明實施例提供的第二種分配模塊的結構示意圖;圖15為本發(fā)明實施例提供的第三種分配模塊的結構示意圖16為本發(fā)明實施例提供的第四種分配模塊的結構示意圖;圖17為本發(fā)明實施例提供的查詢子模塊的結構示意圖;圖18為本發(fā)明實施例提供的第三種定時裝置的結構示意圖。
具體實施例方式為解決現(xiàn)有技術提到的,定時器依賴于所在操作系統(tǒng),受到所在操作系統(tǒng)的信號限制,以及受到每個進程中定時器數(shù)目的限制的問題,本發(fā)明實施例提供了一種定時方法, 具體處理流程如圖1所示,包括步驟101、接收軟件模塊發(fā)送的定時器調(diào)用請求;步驟102、為軟件模塊分配空閑的定時器,并利用被分配的定時器進行計時;步驟103、當被分配的定時器的計時時間到達對應的預設定時時間時,向軟件模塊發(fā)送定時器到時消息。在本發(fā)明實施例中,步驟103在實施之后,被分配的定時器停止計時,并將被分配的定時器恢復為空閑狀態(tài),釋放其占用的資源,以便利用釋放的資源為其他軟件模塊分配定時器。在一個實施例中,如圖1所示流程,步驟102在實施時,利用被分配的定時器進行計時,計時方式可以有多種,例如,利用鏈表方式進行計時,也可以利用數(shù)組方式進行計時, 其中,鏈表或數(shù)組的任意兩個成員之間可代表設定的時間長度值。現(xiàn)以時鐘滴答數(shù)組為例進行說明,此時,利用被分配的定時器進行計時的具體處理流程如圖2所示,包括步驟201、獲取被分配的定時器的預設定時時間,并確定時鐘滴答數(shù)組中游標當前指向的第一成員;步驟202、根據(jù)預設定時時間,估測被分配的定時器的計時時間到達預設定時時間時所述游標指向的第二成員,并將被分配的定時器掛載到第二成員下;步驟203、根據(jù)預設定時時間,預測游標遍歷時鐘滴答數(shù)組的次數(shù)N,其中,N等于預設定時時間與時鐘滴答數(shù)組的總時長的比值向下取整;步驟204、移動游標進行計時,當游標第N+1次移動到指向第二成員時,被分配的定時器的計時時間到達預設定時時間。在本例中,時鐘滴答數(shù)組的大小T IMER_MAX_TMCB_NUM是可以配置的,當然, TIMER_MAX_TMCB_NUM只能夠取彡0的整數(shù),例如,TIMER_MAX_TMCB_NUM可以取值為30000。 實施時,時鐘滴答數(shù)組中每個成員代表一個已預先設定的時間段,各個成員的位置序號按順序依次為0-(TIMER_MAX_TMCB_NUM_l),在時鐘滴答數(shù)組中有一個游標wkanPos指向數(shù)組中的某個成員,代表當前所處的時間,具體結構如圖3所示。當計時的時間到達游標當前所指成員代表的時間段時,游標指向該成員的下一個成員。游標每走一步的時間是通過延時函數(shù)來實現(xiàn),例如在Iinux操作系統(tǒng)中使用usle^O函數(shù)時間。通常將被被分配的定時器掛載到其到時時刻對應的時鐘滴答數(shù)組成員下,當游標移動到指向該成員時,就代表了該定時器到時。實施時,每個成員代表的已設定的時間段 USP_OSS_TIMER_SLEEP (后文可簡稱TIMER_SLEEP)可以是相同的,也可以是不同的,根據(jù)實際情況而定,例如,在時鐘滴答數(shù)組中,每個成員都代表10ms,也可以設置為第一個成員代表10ms,第二個成員代表5ms,第三個成員代表7ms,等等。現(xiàn)以一個具體實施例進行說明,在本例中,TIMER_MAX_TMCB_NUM取值30000,時鐘滴答數(shù)組中每個成員代表10ms,為軟件模塊分配了一個預設定時時間為30ms的定時器,游標需要前移3個成員時,定時器才會超時,這時,向分配了該定時器的軟件模塊發(fā)送消息,告知被分配的定時器已經(jīng)到時,如圖4 所示,游標當前位置指向成員7,定時器的預設定時時間為30ms,每個成員代表10ms,游標需要移動并指向成員9時才到時,因此,將預設定時時間為30ms的定時器掛載在成員9下。 注意,游標指向成員7時,成員7所代表的IOms時間段并沒有被納入計時,在計時時應先計成員7的10ms。對于大于10X30000ms的定時時間,游標會回到時鐘滴答數(shù)組開頭,循環(huán)往
Μ. ο若被分配的定時器的預設定時時間大于時鐘滴答數(shù)組的總時長時,除確定被分配的定時器的計時時間到達對應的預設定時時間,游標在時鐘滴答數(shù)組中指向的成員,還需要確定被分配的定時器在時鐘滴答數(shù)組上循環(huán)的次數(shù)。例如,時鐘滴答數(shù)組的總時長為 10x30000ms,為軟件模塊分配一個定時器A,定時的時間為10X60000ms,游標當前指向成員200,那么A位置的計算過程如下到時時游標應移動的成員數(shù)dwDly = 10*60000/10 ;到時時游標對應的成員dwTime = 200+dwDly-l ;在時鐘滴答數(shù)組上的循環(huán)次數(shù)dwTimerCounter = (dwDly-1)/30000 ;偏移量 wPos = dwTime % 30000 ;根據(jù)上述數(shù)據(jù)可以計算出dwTimerCounter = 1,wPos = 199,所以定時器A應掛載在時鐘滴答數(shù)組中成員199下,游標第二次移動到指向成員199,定時器A到達預設定時時間,計時結束。實施時,游標指向的成員下可能掛載多個定時器,此時,只需要將游標指向的成員下掛載的到時的定時器通知使用這些定時器的軟件模塊,未到時的不需要通知。實施時,為方便管理,當時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,需要采用某些方式對至少一個定時器進行處理,例如,一種較佳的實施方式為采用雙向鏈表方式將該成員下的至少一個定時器串聯(lián),在雙向鏈表中,每個定時器的標識對應一前置變量wPreNode和一后置變量wNextNode,其中,wPreNode用于指向該標識標志的定時器的前一個定時器的標識,WNextNode用于指向該標識標志的定時器的后一個定時器的標識, 具體結構如圖5所示,成員9下掛載著定時器1與定時器2,兩者的標識通過wPreNode和 WNextNode鏈接成雙向鏈表。一種較優(yōu)的處理方式為在已掛載至少一個定時器的成員下增加定時器時,將增加的定時器的標識放到雙向鏈表的表頭,利用增加的定時器的標識的后置變量鏈接雙向鏈表的原表頭對應的定時器。當然,將增加的定時器的標識放在雙向鏈表的表頭是一種較優(yōu)的實施方式,在實際應用中,也可以將增加的定時器的標識放在雙向鏈表的表尾或其他位置,根據(jù)具體情況而定。在一個實施例中,如圖1所示流程,步驟101在實施之后,步驟102在實施之前,還包括查詢空閑的定時器在定時器共享內(nèi)存中的位置,定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組的一個成員,其序號依次
為0、1、2、.......(TIMER_MAX_TIMERS-1),具體結構如圖6所示。一種較優(yōu)的實施方式是
利用空閑結點表,將空閑的定時器在定時器共享內(nèi)存中的位置均記錄在空閑結點表中,具體處理流程如下在空閑結點表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應的空閑的定時器,將確定的空閑的定時器分配給軟件模塊。為方便空閑結點表中進行查詢分配等相關操作,空閑結點表具有指向空閑結點表表頭的頭變量WFreeHead和空閑結點表表尾的尾變量wFreeTail,在應用過程中,在為軟件模塊分配一個空閑的定時器之后,設置wFreeHead在存儲數(shù)組中后移一位;釋放一個被分配的定時器占用的資源之后,設置WFreeTail在存儲數(shù)組中后移一位。初始時刻,空閑結點表中記錄的空閑定時器就是定時器共享內(nèi)存中的所有定時器,此時,wFreeHead = 0, wFreeTail = TIMER_MAX_TIMERS_1,具體結構如圖7所示。實施過程中,為軟件模塊分配一個空閑的定時器之后,wFreeHead在存儲數(shù)組中后移一位,釋放一個被分配的定時器占用的資源之后,wFreeTail在存儲數(shù)組中后移一位。當wFreeHead和wFreeTail指向的成員的數(shù)值大于存儲數(shù)組的最大值TIMER_MAX_TIMERS-1時,wFreeHead和wFreeTail返回并指向存儲數(shù)組的第一位成員0,即wFreeHead和wFreehil在空閑結點表上循環(huán)移動。實施時,定時器的個數(shù)也是可配置的(用TIMER_MAX_TIMERS表示),一般的情況下 100個定時器已經(jīng)足夠使用了,由于定時器是采用靜態(tài)分配內(nèi)存的,考慮到有的設備內(nèi)存較小,可以將定時器個數(shù)配置成較小的定時器個數(shù),這樣就節(jié)省了內(nèi)存空間。在本發(fā)明實施例提供的定時方法中,當被分配的定時器的計時時間未到達對應的預設定時時間時,接收定時器取消請求,通知被分配的定時器停止計時。即,可以在定時器沒有到時的情況下取決定時器計時,靈活性高。由于本發(fā)明實施例提供的定時方法是根據(jù)軟件模塊的定時器調(diào)用請求分配空閑的定時器,而不是使用所在操作系統(tǒng)自帶的定時器進行計時,因此,避免了操作系統(tǒng)自帶定時器依賴于本系統(tǒng)的信號觸發(fā)及處理、受到本系統(tǒng)信號的限制,以及受到進程中定時器數(shù)目的限制。根據(jù)本發(fā)明實施例提供的定時方法,掃描時鐘滴答數(shù)組,確定定時器是否到時,以及到時后的相關處理的具體處理流程如圖8所示,包括步驟801、延時 TIMER_SLEEP 時間;步驟802、判斷游標wScanPos所指時鐘滴答數(shù)組的成員下是否掛載有定時器,若有,執(zhí)行步驟803,若否,返回步驟801 ;步驟803、搜索該成員下的雙向鏈表中的定時器;步驟804、判斷dwCountTimer是否為0,若是,執(zhí)行步驟805,若否,執(zhí)行步驟809 ;步驟805、定時到時,向使用定時器的軟件模塊發(fā)送消息,通知定時到時;步驟806、釋放該定時器,調(diào)整該成員下的雙向鏈表;步驟807、將該定時器添加到空閑結點表中;步驟808、判斷是否到達雙向鏈表的鏈表尾,若是,執(zhí)行步驟801,若否,執(zhí)行步驟 803 ;步驟809、dwCountTimer 減 1,流程結束。根據(jù)本發(fā)明實施例提供的定時方法,利用空閑結點表管理空閑的定時器,其具體處理流程如圖9所示步驟901、查詢空閑結點表,確認當前存在空閑定時器;步驟902、判斷wFreeHead是否等于wFreeTail,若否,執(zhí)行步驟903,若是,執(zhí)行步驟 908 ;步驟903、將空閑結點表中wFreeHead所指的定時器分配給請求定時器的軟件模塊;步驟904、將分配的定時器標識為已用;步驟905、wFreeHead 向后移一位;步驟906、根據(jù)預定定時時間將分配的定時器掛載在對應的時鐘滴答數(shù)組的成員下;步驟907、調(diào)整該成員下的雙向鏈表,將分配的定時器添加到表頭;步驟908、通知請求定時器的軟件模塊沒有空閑的定時器。根據(jù)本發(fā)明實施例提供的定時方法,當定時器到達預設定時時間或者被取消,具體處理流程如圖10所示步驟1001、將到達預設定時時間或者被取消的定時器設置為空閑;步驟1002、修改空閑結點表,將wFreeTail指向該定時器,在空閑結點表中后移一位;步驟1003、調(diào)整該定時器所在的雙向鏈表,將該定時器前后定時器串聯(lián)起來?;谕话l(fā)明構思,本發(fā)明實施例還提供了一種定時裝置,具體結構如圖11所示,包括接收模塊1101,用于接收軟件模塊發(fā)送的定時器調(diào)用請求;分配模塊1102,用于為軟件模塊分配空閑的定時器,并利用被分配的定時器進行計時;發(fā)送模塊1103,用于當被分配的定時器的計時時間到達對應的預設定時時間時, 向軟件模塊發(fā)送定時器到時消息。在一個實施例中,如圖12所示結構,定時裝置還可以包括釋放模塊1201,用于向軟件模塊發(fā)送定時器到時消息之后,將被分配的定時器恢復為空閑狀態(tài),并釋放被分配的定時器占用的資源。在一個實施例中,如圖13所示結構,分配模塊1102可以包括獲取子模塊1301,用于獲取被分配的定時器的預設定時時間,并確定時鐘滴答數(shù)組中游標當前指向的第一成員;估測子模塊1302,用于估測被分配的定時器的計時時間到達預設定時時間時游標指向的第二成員,并將被分配的定時器掛載到第二成員下;預測子模塊1303,用于根據(jù)預設定時時間,預測游標遍歷時鐘滴答數(shù)組的次數(shù)N, 其中,0的整數(shù),且N等于預設定時時間與時鐘滴答數(shù)組的總時長的比值向下取整;計時子模塊1304,用于移動游標進行計時,當游標第N+1次移動到指向第二成員時,被分配的定時器的計時時間到達預設定時時間。在一個實施例中,如圖14所示結構,分配模塊1102還可以包括串聯(lián)子模塊1401,用于當時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙向鏈表方式將該成員下的至少一個定時器的標識串聯(lián);在雙向鏈表中,每個定時器的標識對應一前置變量wPreNode和一后置變量wNextNode,其中,wPreNode用于指向該標識標志的定時器的前一個定時器的標識,wNextNode用于指向該標識標志的定時器的后一個
1定時器的標識。在一個實施例中,如圖15所示結構,分配模塊1102還可以包括增加子模塊1501,用于在已掛載至少一個定時器的成員下增加定時器時,將增加的定時器的標識放到雙向鏈表的表頭,利用增加的定時器的標識的后置變量鏈接雙向鏈表的原表頭對應的定時器的標識。在一個實施例中,如圖16所示結構,分配模塊1102可以包括查詢子模塊1601,用于在空閑結點表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組的一個成員;確定子模塊1602,用于根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應的空閑的定時器;分配子模塊1603,用于將確定的空閑的定時器分配給所述軟件模塊。在一個實施例中,如圖17所示結構,查詢子模塊1601還可以包括設置單元1701,用于當空閑結點表具有指向空閑結點表表頭的頭變量wFreeHead 和指向空閑結點表表尾的尾變量wFreeTai 1,且當wFreeHead和所述wFreeTai 1指向的成員的數(shù)值均大于存儲數(shù)組的最大值時,設置WFreeHead和所述wFreeTail返回并指向存儲數(shù)組的第一位成員;第一后移單元1702,用于為軟件模塊分配一個空閑的定時器之后,設置 wFreeHead在存儲數(shù)組中后移一位;第二后移單元1703,用于釋放一個被分配的定時器占用的資源之后,設置 wFreeTail在存儲數(shù)組中后移一位。在一個實施例中,如圖18所示結構,定時裝置還可以包括取消模塊1801,用于當被分配的定時器的計時時間未到達對應的預設定時時間時,接收定時器取消請求,通知被分配的定時器停止計時。在本發(fā)明實施例中,根據(jù)軟件模塊的定時器調(diào)用請求分配空閑的定時器,而不是使用所在操作系統(tǒng)自帶的定時器進行計時,當被分配的定時器的計時時間到達對應的預設定時時間時,向軟件模塊發(fā)送定時器到時消息,能夠避免了操作系統(tǒng)自帶定時器依賴于本系統(tǒng)的信號觸發(fā)及處理、受到本系統(tǒng)信號的限制,以及受到進程中定時器數(shù)目的限制,以及,不影響軟件模塊自身的信號觸發(fā)及處理,也不會影響軟件模塊正在處理的進程,避免進程執(zhí)行過程中信號突然中止的問題。進一步,在當被分配的定時器的計時時間未到達對應的預設定時時間時,接收定時器取消請求,通知被分配的定時器停止計時。即,可以在定時器沒有到時的情況下取決定時器計時,靈活性高。進一步,向軟件模塊發(fā)送定時器到時消息之后,釋放被分配的定時器占用的資源, 能夠大幅度地節(jié)省內(nèi)存資源,提高內(nèi)存的利用率。顯然,本領域的技術人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權利要求及其等同技術的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權利要求
1.一種定時方法,其特征在于,包括 接收軟件模塊發(fā)送的定時器調(diào)用請求;為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進行計時; 當所述被分配的定時器的計時時間到達對應的預設定時時間時,向所述軟件模塊發(fā)送定時器到時消息。
2.如權利要求1所述的方法,其特征在于,向所述軟件模塊發(fā)送定時器到時消息之后, 還包括將所述被分配的定時器恢復為空閑狀態(tài),并釋放所述被分配的定時器占用的資源。
3.如權利要求1或2所述的方法,其特征在于,所述利用被分配的定時器進行計時,包括獲取所述被分配的定時器的預設定時時間,并確定時鐘滴答數(shù)組中游標當前指向的第一成員,所述成員代表設定的時間長度值;根據(jù)所述預設定時時間,估測所述被分配的定時器的計時時間到達所述預設定時時間時所述游標指向的第二成員,并將所述被分配的定時器掛載到所述第二成員下;根據(jù)所述預設定時時間,預測所述游標遍歷所述時鐘滴答數(shù)組的次數(shù)N,其中,N等于所述預設定時時間與所述時鐘滴答數(shù)組的總時長的比值向下取整;移動所述游標進行計時,當所述游標第N+1次移動到指向第二成員時,所述被分配的定時器的計時時間到達所述預設定時時間。
4.如權利要求3所述的方法,其特征在于,還包括當所述時鐘滴答數(shù)組的一個成員下掛載至少一個定時器時,采用雙向鏈表方式將該成員下的至少一個定時器的標識串聯(lián);在所述雙向鏈表中,每個定時器的標識對應一前置變量WPreNode和一后置變量 wNextNode,其中,所述wPreNode用于指向該標識標志的定時器的前一個定時器的標識,所述WNextNode用于指向該標識標志的定時器的后一個定時器的標識。
5.如權利要求4所述的方法,其特征在于,還包括在已掛載至少一個定時器的成員下增加定時器時,將增加的定時器的標識放到所述雙向鏈表的表頭,利用所述增加的定時器的標識的后置變量鏈接所述雙向鏈表的原表頭對應的定時器的標識。
6.如權利要求2所述的方法,其特征在于,所述為所述軟件模塊分配定時器,包括在空閑結點表中查詢空閑的定時器在定時器共享內(nèi)存中的位置信息,所述定時器共享內(nèi)存按數(shù)組方式存儲已被分配的定時器和空閑的定時器,每個定時器是其所在的存儲數(shù)組的一個成員;根據(jù)查詢到的位置信息在定時器共享內(nèi)存中確定對應的空閑的定時器; 將確定的空閑的定時器分配給所述軟件模塊。
7.如權利要求6所述的方法,其特征在于,所述空閑結點表具有指向所述空閑結點表表頭的頭變量wFre eHead和指向所述空閑結點表表尾的尾變量wFre eTa i 1,且當所述 WFreeHead和所述wFreeTail指向的成員的數(shù)值均大于所述存儲數(shù)組的最大值時,設置所述wFreeHead和所述wFreeTail返回并指向所述存儲數(shù)組的第一位成員;為所述軟件模塊分配一個空閑的定時器之后,設置所述wFreeHead在所述存儲數(shù)組中后移一位;釋放一個被分配的定時器占用的資源之后,設置所述wFreeTail在所述存儲數(shù)組中后移一位。
8.如權利要求1所述的方法,其特征在于,還包括當所述被分配的定時器的計時時間未到達對應的預設定時時間時,接收定時器取消請求,通知被分配的定時器停止計時。
全文摘要
本發(fā)明公開了一種定時方法,包括接收軟件模塊發(fā)送的定時器調(diào)用請求;為所述軟件模塊分配空閑的定時器,并利用被分配的定時器進行計時;當所述被分配的定時器的計時時間到達對應的預設定時時間時,向所述軟件模塊發(fā)送定時器到時消息。本發(fā)明還公開了一種定時裝置。采用本發(fā)明可以解決現(xiàn)有技術中存在定時器受到所在操作系統(tǒng)的信號的限制,以及每個進程中定時器數(shù)目的限制的問題。
文檔編號G06F1/06GK102478878SQ20101055954
公開日2012年5月30日 申請日期2010年11月23日 優(yōu)先權日2010年11月23日
發(fā)明者高峰 申請人:天津中興軟件有限責任公司