在專案開發中,很多功能模組都會用到定時功能,比如說定時3分鐘後點亮乙個led燈,定時1個小時後自動關機等,如果專案中只用到了乙個應用層級別的定時功能,可能簡單的寫一下就好了,但是當專案中有多個定時功能需求的話,反而是把定時功能單獨拿出來,寫成乙個功能模組,更簡單更清晰。
建立timset.c,timset.h,在timset.**件中宣告需要用的資料型別,及宣告外部檔案呼叫要用的api函式,在timset.c中實現api介面函式
//列舉用到定時功能的模組,根據自己需求定義
typedef enum
em_timsetmoudle;
//列舉定時功能的不同狀態
typedef enum
em_timsetsta;
//定義觸發定時到達處理函式時的觸發方式
#define tshtype_timover 1 //到達設定時間後觸發處理函式
#define tshtype_interrupt 2 //未到達設定時間,中間人為打斷
//定義函式指標型別
typedef void (*pfun)(uint8_t);
//定義處理結構體
typedef struct
st_timsetdata;
//初始化指定功能模組,指定其處理函式
void timset_initone(em_timsetmoudle tarmoudle,pfun handlefun);
//總初始化函式
void timset_initall(void);
//啟動某個具體模組定時功能
void timset_start(em_timsetmoudle tarmoudle,unsigned long seconds);
//停止某個具體模組定時功能,原有計時時間清零
void timset_stop(em_timsetmoudle tarmoudlee);
//暫停某個具體模組定時功能,再次呼叫timset_start()開啟執行,原有定時時間不清零
void timset_pause(em_timsetmoudle tarmoudle);
//外部主動結束乙個定時任務,同timset_stop()不同的是會觸發處理函式
void timset_exstopmoudle(em_timsetmoudle tarmoudle);
//輪循處理函式,每乙個時間單位呼叫一次,當前時間單位為1s
void timset_loop(void);
//獲取某個定時任務的定時總時間
unsigned long timset_gettargettime(em_timsetmoudle tarmoudle);
//獲取某個定時任務的定時剩餘時間
unsigned long timset_getlefttime(em_timsetmoudle tarmoudle);
//獲取某個定時任務的狀態
em_timsetsta timset_getmoudlesta(em_timsetmoudle tarmoudle);
//獲取總共的定時任務數量
unsigned char timset_getmaxtask();
//獲取當前處於執行狀態的定時任務數量
unsigned char timset_getruntask();
#include "timset.h"
st_timsetdata gs_timsetdata[num_tsm];
static unsigned char gu8_curruntask=0; //當前處於執行狀態的定時任務數量
//具體某個定時功能模組定時完成或中間打斷後呼叫的處理函式示例
void timset_heathandle(uint8_t type)
else if(type==tshtype_timover)
else }
//具體某個定時功能模組定時完成或中間打斷後呼叫的處理函式示例
void timset_safehandle(uint8_t type)
else if(type==tshtype_timover)
else }
//初始化乙個定時功能模組
void timset_initone(em_timsetmoudle tarmoudle,pfun handlefun)
gs_timsetdata[tarmoudle].handlefun = handlefun;
gs_timsetdata[tarmoudle].laststa = timsetsta_end;
gs_timsetdata[tarmoudle].cursta = timsetsta_stop;
gs_timsetdata[tarmoudle].tartime = 0;
gs_timsetdata[tarmoudle].timecnt = 0;
}//定時模組總初始化函式
void timset_initall()
//啟動,單位s
void timset_start(em_timsetmoudle tarmoudle,unsigned long seconds)
if(gs_timsetdata[tarmoudle].cursta != timsetsta_run)
gs_timsetdata[tarmoudle].tartime = seconds;
if (gs_timsetdata[tarmoudle].cursta != timsetsta_pasuse)
gs_timsetdata[tarmoudle].cursta = timsetsta_run;
}//停止對應的模組的定時
void timset_stop(em_timsetmoudle tarmoudle)
if(gs_timsetdata[tarmoudle].cursta != timsetsta_stop)
gs_timsetdata[tarmoudle].cursta = timsetsta_stop;
}//暫停定時,再次呼叫啟動函式時不會將原有計時數清零
void timset_pause(em_timsetmoudle tarmoudle)
if(gs_timsetdata[tarmoudle].cursta != timsetsta_pasuse)
gs_timsetdata[tarmoudle].cursta = timsetsta_pasuse;
}//獲取某個定時模組的目標定時時間
unsigned long timset_gettargettime(em_timsetmoudle tarmoudle)
return gs_timsetdata[tarmoudle].tartime;
}//獲取某個定時模組的定時剩餘時間
unsigned long timset_getlefttime(em_timsetmoudle tarmoudle)
if (gs_timsetdata[tarmoudle].timecnt >= gs_timsetdata[tarmoudle].tartime)
else if (gs_timsetdata[tarmoudle].cursta == timsetsta_stop)
return gs_timsetdata[tarmoudle].tartime - gs_timsetdata[tarmoudle].timecnt;
}//獲取某個定時模組的狀態
em_timsetsta timset_getmoudlesta(em_timsetmoudle tarmoudle)
//獲取總定時任務
unsigned char timset_getmaxtask()
//獲取當前處於執行狀態的定時任務
unsigned char timset_getruntask()
//外部主動結束乙個定時任務,同timset_stop()不同的是會觸發處理函式
void timset_exstopmoudle(em_timsetmoudle tarmoudle)
//乙個單位時間呼叫一次,當前為1s
void timset_loop()
break;
case timsetsta_pasuse:
gs_timsetdata[index].laststa = gs_timsetdata[index].cursta;
break;
default:
gs_timsetdata[index].cursta = timsetsta_stop;
break;
} }
}
說明:
1.在timset_initall()函式中實現所有用到的功能模組的定時任務的初始化,將處理函式與定時模組繫結。
2.呼叫timset_start()函式啟動乙個定時任務,呼叫timset_stop()結束乙個定時任務,呼叫timset_pause()暫停乙個定時任務
3.呼叫timset_pause()暫停乙個定時任務後,再次啟動時呼叫timset_start()啟動,之前的計時時間不會清零
4.乙個定時任務啟動後,如果在定時期間遇到某些情況需要提前取消定時任務,如需呼叫對應的處理函式處理這一情況,就呼叫timset_exstopmoudle()函式結束此任務,如不需呼叫對應的處理函式,呼叫timset_stop()即可。
5.乙個時間單位呼叫一次timset_loop()函式,乙個任務的定時時間=時間單位*設定的定時數值。當前我用的時間單位為1s,所以1s呼叫一次timset_loop()即可
簡單快捷優雅的實現乙個定時任務
什麼場景 獲取token 最近也是遇到了一些煩惱,比如獲取 token 一天內獲取的次數有限,每次獲取到的 token 也是有一定的有效期。針對這種情況,其實需要我們定時的去獲取token,並且重新整理到快取中,但是如果在多台機子的情況下,我們需要去做乙個分布式鎖,每次只保證有一台機子去獲取toke...
linux實現乙個定時任務
編寫指令碼 touch cleanlogs.sh bin sh find weblogic logs backend mtime 10 name log exec rm f 使用root使用者賦許可權,su 到root使用者下 chomd 777 cleanlogs.sh將該指令碼加入定時任務 vi...
定時任務配置 乙個簡單的定時任務排程中心設計方案
在日常開發中除了給前端開發介面,還要寫一些定時處理任務,比如乙個活動需要每天定時給所有使用者派發獎勵。乙個成熟服務框架需要乙個全域性的定時任務排程中心,通過定時任務排程中心可以檢視服務有哪些定時任務以及定時任務的執 況,對於執行失敗的定時任務可以手動執行等。我們公司的微服務架構沒有定時任務排程中心,...