本發(fā)明涉及一種掛時控(設(shè)置定時器)的方法,特別是一種線程中掛時控的方法。
背景技術(shù):
:現(xiàn)階段,多線程技術(shù)廣泛應(yīng)用在軟件開發(fā)中,如果在線程中需要進行時控(或定時器)處理,目前基本上是使用sleep類似的阻塞定時方式,但在這種阻塞方式下,線程處于阻塞狀態(tài),不能處理其他消息或事務(wù),弊端非常明顯。如果直接像進程那樣掛時控,對線程來說是無法確保一定能響應(yīng)到時到信號(linux下一般使用SIGALRM信號)的,而且在線程中響應(yīng)這些時到信號將會帶來不可預(yù)估的后果,因此目前一直未有一種有效的在線程中以非阻塞方式掛時控的方法。技術(shù)實現(xiàn)要素:發(fā)明目的:本發(fā)明所要解決的技術(shù)問題(或目的)是在線程中以非阻塞方式掛時控并能響應(yīng)處理時控的方法。技術(shù)方案:本發(fā)明提出了一種在線程中以非阻塞方式掛時控并能響應(yīng)時控處理的方法。該方法主要包括以下步驟:步驟1,創(chuàng)建進程的時控隊列timerList、掛時控函數(shù)setTimer_Thread以及時控響應(yīng)函數(shù)timerFunction;進程由線程組成,如果是多線程,一般把線程分為主線程(有時代表進程)和子線程(或者叫次線程);步驟2,創(chuàng)建子線程及與主線程進行交互的消息鏈表,屏蔽掉子線程中時控信號,需要掛時控時,直接調(diào)用掛時控函數(shù)setTimer_Thread掛時控;步驟3,主線程響應(yīng)時到信號,并執(zhí)行時控響應(yīng)函數(shù)timerFunction,將線程時控屬性轉(zhuǎn)換為時控消息加入到對應(yīng)線程的消息鏈表中;步驟4,子線程取出時控消息,得到時控屬性,根據(jù)時控屬性進行相應(yīng)的時控處理。步驟1中,所述時控隊列timerList用于存儲整個進程所有線程的時控;時控隊列timerList中的每個時控項包含兩個時控屬性,分別為時控屬性一和時控屬性二,時控屬性一用于指示線程ID,時控屬性二用于指示時間屬性ID;時控隊列timerList中,各時控項按時控時到先后順序依次排列;掛時控函數(shù)setTimer_Thread包含四個參數(shù):時控屬性一、時控屬性二、時控標識和時間值,其中,時控標識用于指示是掛時控還是刪除時控,時間值是指時控的相對于掛時控時的時間值;時控響應(yīng)函數(shù)timerFunction為進程的時控響應(yīng)函數(shù),所有時到響應(yīng)都首先執(zhí)行此函數(shù)。步驟1中所述掛時控函數(shù)setTimer_Thread執(zhí)行如下步驟:步驟1-1,根據(jù)時控屬性一與時控屬性二生成Hash關(guān)鍵字;步驟1-2,判定時控標識,如果為掛時控,則轉(zhuǎn)到步驟1-3,如果是取消時控則轉(zhuǎn)到步驟1-6;步驟1-3,根據(jù)Hash關(guān)鍵字找到時控項的存儲位置,存儲時控項;步驟1-4,根據(jù)時控的時到順序,在時控隊列timerList中找到對應(yīng)的位置,插入該時控;步驟1-5,如果該時控處于時控隊列timerList隊首,則調(diào)用系統(tǒng)函數(shù)setitimer重掛進程的時控;步驟1-6,根據(jù)Hash關(guān)鍵字,找到該時控的存儲位置及在時控隊列中的位置;步驟1-7,從時控隊列timerList中刪除該時控;步驟1-8,如果該時控處于時控隊列timerList隊首,則調(diào)用系統(tǒng)函數(shù)setitimer根據(jù)時控隊列timerList新隊首的時控項重掛進程的時控。步驟2中,所述子線程與主線程進行交互的消息鏈表項包含三部分:消息長度、消息屬性標識和消息內(nèi)容,消息長度指消息的字節(jié)數(shù);消息屬性標識用于指示該消息是普通消息還是時控消息;消息內(nèi)容即消息的詳細內(nèi)容,如果消息屬性標識為1,則其前兩個字節(jié)存儲的是時控屬性二。如果不為1,則存儲的為消息的詳細內(nèi)容(字節(jié)串),消息長度指示了字節(jié)串中的字節(jié)數(shù)(前兩個字節(jié)就是消息字節(jié)串的前兩個字節(jié))。步驟2中,每個子線程對應(yīng)一個消息鏈表,主線程或子線程訪問該消息鏈表時,利用線程鎖進行加鎖,訪問結(jié)束解鎖。線程中屏蔽掉時控信號,是為了只有主線程才能響應(yīng)時控信號。線程中掛時控直接調(diào)用setTimer_Thread,其本質(zhì)是線程把時控插入到進程的時控隊列中,某一時刻在進程中實際上只有時控隊列隊首的時控在執(zhí)行。步驟3中,所述主線程響應(yīng)時到信號,并執(zhí)行時控響應(yīng)函數(shù)timerFunction,包括如下步驟:步驟3-1,從時控隊列timerList隊首取出一個時控項,并調(diào)整其下一個時控的前向指針;步驟3-2,判定時控項的時控屬性一,如果為0,轉(zhuǎn)向步驟3-3;如果為1,則轉(zhuǎn)向步驟3-4;步驟3-3,主線程根據(jù)時控屬性二進行相應(yīng)的時控處理(時控處理是根據(jù)實際需要定義的,譬如應(yīng)用每隔五分鐘檢查文件大小,達到1MB就轉(zhuǎn)存,那么五分鐘時控到了,時控處理就是檢查文件大小,如果達到1MB就轉(zhuǎn)存),然后轉(zhuǎn)向步驟3-8;步驟3-4,根據(jù)時控屬性一找到對應(yīng)線程ID的子線程,把時控屬性二封裝成時控消息;步驟3-5,對該對應(yīng)線程的消息鏈表加鎖;步驟3-6,若該消息鏈表為空,直接插入時控消息;若不為空,則從頭開始查找到第一個消息屬性標識msgFlag為0的項,即第一個普通消息,在其前面插入時控消息;步驟3-7,對該消息鏈表解鎖,并通知該子線程;步驟3-8,根據(jù)時控隊列timerList隊首的時控項,調(diào)用系統(tǒng)函數(shù)setitimer重新掛進程的時控。步驟4包括如下步驟:步驟4-1,屏蔽SIGALRM信號,確保線程不會響應(yīng)進程的信號;步驟4-2,對消息鏈表加鎖;步驟4-3,依次取出消息鏈表中的消息,存入線程的局部鏈表中;步驟4-4,對消息鏈表解鎖;步驟4-5,從線程的局部鏈表中逐一取出消息處理;步驟4-6,判定消息屬性標識msgFlag,如果為普通消息,轉(zhuǎn)到步驟4-7,如果為時控消息,則轉(zhuǎn)到步驟4-8;步驟4-7,對該普通消息進行處理,返回到步驟4-2;步驟4-8,從該時控消息中提取時控屬性二,進行對應(yīng)的時控處理;步驟4-9,返回到步驟4-2。本發(fā)明采用了獨特的在線程中掛時控(本質(zhì)為將線程時控插入到進程的時控隊列中),由主線程(實際掛時控并)響應(yīng)時到信號,再將線程的時控屬性轉(zhuǎn)換為線程時控消息傳遞給線程,線程從時控消息中獲得時控屬性并進行相應(yīng)時控處理的方法,最終實現(xiàn)了在線程中以非阻塞方式掛時控并響應(yīng)時控處理。有益效果:本發(fā)明采用了獨特的在線程中掛時控(本質(zhì)為將時控插入到進程的時控隊列中),由主線程(實際掛時控并)響應(yīng)時到信號,再將線程的時控屬性轉(zhuǎn)換為線程時控消息傳遞給線程,線程從時控消息中獲得時控屬性并進行相應(yīng)時控處理的方法,最終實現(xiàn)了在線程中以非阻塞方式掛時控并響應(yīng)時控處理。本發(fā)明實現(xiàn)原理簡單可靠,通過工程實踐證明,本發(fā)明是一種有效的在線程中以非阻塞方式掛時控的方法。下面結(jié)合附圖對本發(fā)明作進一步詳細描述。附圖說明下面結(jié)合附圖和具體實施方式對本發(fā)明做更進一步的具體說明,本發(fā)明的上述和/或其他方面的優(yōu)點將會變得更加清楚。圖1本發(fā)明的setTimer_Thread實現(xiàn)流程圖。圖2本發(fā)明的timerFunction實現(xiàn)流程圖。圖3本發(fā)明的子線程執(zhí)行流程圖。具體實施方式下面結(jié)合附圖對本發(fā)明作具體說明。應(yīng)該指出,所描述的實施例僅是為了說明的目的,而不是對本發(fā)明范圍的限制。結(jié)合圖1—圖3,本發(fā)明包括以下處理步驟:步驟1,創(chuàng)建進程的時控隊列timerList,掛時控函數(shù)setTimer_Thread,及時控響應(yīng)函數(shù)timerFunction。其中時控隊列timerList中的每個時控項包含兩個時控屬性,時控屬性一用來指示線程ID,時控屬性二指示時間屬性ID;timerList中,各時控項按時控時到先后順序依次排列。時控隊列timerList中存儲的詳細數(shù)據(jù)信息如下表1:表1名稱類型備注Attr1Unsignedshort時控屬性一,為線程ID,其中0表示主線程Attr2Unsignedshort時控屬性二,時間屬性IDtimerFlagUnsignedchar時控標識,0-相對時控,1-絕對時控XtDouble相對時控值,距離當前時間的秒數(shù)JtDouble絕對時控值,距離1970年1月1日0點的秒數(shù)Prior指針前向指針Next指針后向指針掛時控函數(shù)setTimer_Thread包含四個參數(shù):時控屬性一,時控屬性二,時控標識,時間值,其處理步驟如下(參見圖1本發(fā)明的掛時控函數(shù)setTimer_Thread實現(xiàn)流程圖):步驟1-1,根據(jù)時控屬性一與時控屬性二生成Hash關(guān)鍵字;步驟1-2,判定時控標識,如果為掛時控,則轉(zhuǎn)到步驟1-3,如果是取消時控則轉(zhuǎn)到步驟1-6;步驟1-3,根據(jù)Hash關(guān)鍵字找到時控項的存儲位置,存儲時控項;步驟1-4,根據(jù)時控的時到順序,在時控隊列timerList中找到對應(yīng)的位置,插入該時控;步驟1-5,如果該時控處于時控隊列timerList隊首,則調(diào)用系統(tǒng)函數(shù)setitimer重掛進程的時控;步驟1-6,根據(jù)Hash關(guān)鍵字,找到該時控的存儲位置及在時控隊列中的位置;步驟1-7,從時控隊列timerList中刪除該時控;步驟1-8,如果該時控處于時控隊列timerList隊首,則調(diào)用系統(tǒng)函數(shù)setitimer根據(jù)時控隊列timerList新隊首的時控項重掛進程的時控。步驟2,創(chuàng)建子線程及其與主線程進行交互的消息鏈表,子線程中屏蔽掉時控信號,循環(huán)執(zhí)行,需要掛時控時,直接調(diào)用setTimer_Thread掛時控。步驟2中,所述子線程與主線程進行交互的消息鏈表項包含三部分:消息長度、消息屬性標識和消息內(nèi)容,消息長度指消息的字節(jié)數(shù);消息屬性標識用于指示該消息是普通消息還是時控消息;消息內(nèi)容即消息的詳細內(nèi)容,如果消息屬性標識為1,則其前兩個字節(jié)存儲的是時控屬性二。如果不為1,則存儲的為消息的詳細內(nèi)容(字節(jié)串),消息長度指示了字節(jié)串中的字節(jié)數(shù)(前兩個字節(jié)就是消息字節(jié)串的前兩個字節(jié))。消息鏈表項的詳細數(shù)據(jù)信息如下表2:表2步驟3,時控到時,主線程響應(yīng)時到信號執(zhí)行時控響應(yīng)函數(shù)timerFunction,其處理步驟如下(參見圖2本發(fā)明的timerFunction實現(xiàn)流程圖):步驟3-1,從時控隊列timerList隊首取出一個時控項,并調(diào)整其下一個時控的前向指針;步驟3-2,判定時控項的時控屬性一,如果為0,轉(zhuǎn)向步驟3-3;如果為1,則轉(zhuǎn)向步驟3-4;步驟3-3,主線程根據(jù)時控屬性二進行相應(yīng)的時控處理,然后轉(zhuǎn)向步驟3-8;步驟3-4,根據(jù)時控屬性一找到對應(yīng)線程ID的子線程,把時控屬性二封裝成時控消息;步驟3-5,對該對應(yīng)線程的消息鏈表加鎖;步驟3-6,若該消息鏈表為空,直接插入時控消息;若不為空,則從頭開始查找到第一個消息屬性標識msgFlag為0的項,即第一個普通消息,在其前面插入時控消息;步驟3-7,對該消息鏈表解鎖,并通知該子線程;步驟3-8,根據(jù)時控隊列timerList隊首的時控項,調(diào)用系統(tǒng)函數(shù)setitimer重新掛進程的時控。步驟4,子線程取出時控消息進行時控處理,子線程運行處理步驟如下(參見圖3本發(fā)明的子線程執(zhí)行流程圖):步驟4-1,屏蔽SIGALRM信號,確保線程不會響應(yīng)進程的信號;步驟4-2,對消息鏈表加鎖;步驟4-3,依次取出消息鏈表中的消息,存入線程的局部鏈表中;步驟4-4,對消息鏈表解鎖;步驟4-5,從線程的局部鏈表中逐一取出消息處理;步驟4-6,判定消息屬性標識msgFlag,如果為普通消息,轉(zhuǎn)到步驟4-7,如果為時控消息,則轉(zhuǎn)到步驟4-8;步驟4-7,對該普通消息進行處理,返回到步驟4-2;步驟4-8,從該時控消息中提取時控屬性二,進行對應(yīng)的時控處理;步驟4-9,返回到步驟4-2。步驟3、步驟4中,所有的時控時到時,首先由進程的timerFunction進行響應(yīng),該響應(yīng)函數(shù)將根據(jù)時控屬性一找到對應(yīng)線程,將時控屬性二轉(zhuǎn)換為時控消息插入到該線程的消息鏈表中,而線程從消息鏈表中取出時控消息,根據(jù)時控消息中的時控屬性Attr2,最終實現(xiàn)對應(yīng)時控的處理。本發(fā)明提供了一種線程中掛時控的方法,具體實現(xiàn)該技術(shù)方案的方法和途徑很多,以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當指出,對于本
技術(shù)領(lǐng)域:
的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。本實施例中未明確的各組成部分均可用現(xiàn)有技術(shù)加以實現(xiàn)。當前第1頁1 2 3