讓你提前認識軟體開發(21):C程式中的定時器
第1部分 重新認識C語言
C程式中的定時器
【文章摘要】
在實際的C程式中,一個模組執行多個操作是很常見的事情。如果多個操作同時進行,會出現程式效率低下、計算機CPU佔用率過高等情況,這時就需要對所有操作的執行順序作一個合理的安排,這就涉及到定時器的使用。
本文對C程式中的定時器的型別、設定和清除方法等作了詳細的介紹,為相關開發工作的開展提供了參考。
【關鍵詞】
C程式 定時器 操作 開發
一、定時器的定義及分類
我們所熟悉的定時器是一個多工定時提醒的軟體,安裝於電腦或手機上。舉個例子,我們經常用的鬧鐘其實就是定時器,它會在我們設定的時間執行某種程式,在其它時間則處於休眠狀態。
那麼什麼是C程式中的定時器呢?C程式中的定時器是程式設計師編寫的用於定時執行某種操作的程式,是相關C程式碼的集合。這個定時器是“幕後的英雄”,我們能夠看到的是軟體所體現出來的某項功能,而看不見的是定時器所起的作用。
根據所起的作用的不同,C程式中的定時器分為如下兩類:
第一類,在多個操作中設定不同操作執行順序的定時器。在一個很大的軟體模組中,同時進行多個操作會降低程式的執行效率,合理地使用定時器能夠讓某些操作避開程式執行的“高峰期”,達到舒緩程式執行壓力的作用。這時的定時器所起的作用和在上下班時間十字路口的紅綠燈的作用類似。
第二類,用於限制某種操作的執行時間,若在規定時間內沒有執行該操作則作超時處理的定時器
在C程式中,合理利用定時器,可提高程式的執行效率,同時可讓程式體現出邏輯層次感和嚴密性。
二、定時器的資料結構
為了完成功能,一個典型的定時器的資料結構如下:
// 先重定義基本資料型別
typedef unsigned char UINT8;
typedef unsigned short int UINT16;
typedef unsigned int UINT32;
// 定時器的資料結構
typedef struct
{
……
……
UINT8 iUseFlag; // 該定時器是否正在使用
UINT8 iArrivedFlag; // 使用該定時器的時間是否已到
UINT8 iTimerType; // 該定時器的型別
UINT16 iModuleNo; // 使用該定時器的模組號/程序號等資訊
UINT32 iSetTime; // 設定該定時器的啟動時間, 即相對此刻, 該定時器在多長時間之後啟動
UINT8 iTimerNo; // 該定時器的編號
UINT8 iQue; // 該定時器的存放佇列
UINT16 iQuePrev; // 該定時器的存放位置的前一個結點
UINT16 iQueNext; // 該定時器的存放位置的後一個結點
……
……
} TimerStruc_T;
一個定時器結構體所包含的欄位根據不同軟體產品和專案組的要求而略有區別,但如上面結構體中羅列出來的欄位都是需要的。欄位的含義見對應欄位後面的註釋。
三、如何設定和清除定時器
3.1 設定定時器的流程
在實際的軟體開發專案中,一般將設定定時器的流程封裝為函式。在需要設定定時器的時候,只需要呼叫該函式即可。
設定定時器的流程如圖1所示。
圖1 設定定時器的流程
有關此流程的說明如下:
(1) 在設定定時器之前,先要判斷該定時器是否正在使用。如果在使用中,那麼要先清除定時器以釋放資源。這是為了防止一個定時器有多種用途的情況。
(2) 在獲取定時器存放資源之前,要對初始化及資訊入隊操作進行加鎖處理。為了防止同樣的資源被多個定時器獲得。
3.2 清除定時器的流程
清除定時器的操作同樣會被封裝為函式。在需要清除定時器的時候,只需要呼叫該函式即可。
清除定時器的流程如圖2所示。
圖2 清除定時器的流程
有關此流程的說明如下:
(1) 在清除定時器之前,先要判斷該定時器是否正在使用及清除時間是否達到。如果兩者中有一個不滿足,則不用清除定時器。
(2) 在清除定時器相關資訊之前,為了保持操作的唯一性,同樣要進行加鎖處理。
四、總結
隨著程式功能的日益完善和豐富,不同操作執行順序越發顯得重要,這就為定時器提供了施展才能的“舞臺”。
本文以作者的實際專案開發工作為背景,對C程式中的定時器的型別、設定和清除方法等作了詳細的描述,為相關模組的設計和程式的編寫提供了有益的參考。