在工業生產控制系統中,有許多需要定時完成的操作,如定時顯示目前時間,定時重新整理螢幕上的進度條,上位 機定時向下位機發送命令和傳送資料等。特別是在對控制效能要求較高的即時控制系統和資料擷取系統中,就更需要精確定時操作。
眾所周知,Windows 是基於訊息機制的系統,任何事件的執行都是通過發送和接收訊息來完成的。 這樣就帶來了一些問題,如一旦電腦的CPU被某個進程佔用,或系統資源緊張時,發送到訊息佇列 中的訊息就暫時被掛起,得不到即時處理。因此,不能簡單地通過Windows訊息引發一個對定時要求 嚴格的事件。另外,由於在Windows中已經封裝了電腦底層硬體的訪問,所以,要想通過直接利用 訪問硬體來完成精確定時,也比較困難。所以在實際應用時,應針對具體定時精度的要求,採取相適 應的定時方法。
VC中提供了很多關於時間操作的函數,利用它們控製程序能夠精確地完成定時和計時操作。本文詳細介紹了VC中基於Windows的精確定時的七種方式,如下圖所示:
圖一 映像描述
方式一:VC中的WM_TIMER訊息映射能進行簡單的時間控制。首先調用函數SetTimer()設定定時 間隔,如SetTimer(0,200,NULL)即為設定200ms的時間間隔。然後在應用程式中增加定時響應函數 OnTimer(),並在該函數中添加響應的處理語句,用來完成到達定時時間的操作。這種定時方法非常 簡單,可以實現一定的定時功能,但其定時功能如同Sleep()函數的延時功能一樣,精度非常低,最小 計時精度僅為30ms,CPU佔用低,且定時器訊息在多任務作業系統中的優先順序很低,不能得到及時響 應,往往不能滿足即時控制環境下的應用。只可以用來實現諸如位元影像的動態顯示等對定時精度要求不高的情況。如樣本工程中的Timer1。
方式二:VC中使用sleep()函數實現延時,它的單位是ms,如延時2秒,用sleep(2000)。精度非常 低,最小計時精度僅為30ms,用sleep函數的不利處在於延時期間不能處理其他的訊息,如果時間太 長,就好象死機一樣,CPU佔用率非常高,只能用於要求不高的延時程式中。如樣本工程中的Timer2。