定時器使用

2021-06-17 22:26:34 字數 2511 閱讀 6407

dword winapi checksendinfovector(lpvoid lpparameter)

}return 0;

}void callback dotimer(hwnd hwnd,  uint umsg,uint_ptr idevent,  dword dwtime)

timerproc的引數hwnd是在呼叫settimer時指定的視窗控制代碼。windows只把wm_timer訊息送給timerproc,因此訊息引數總是等於wm_timer。itimerid值是計時器id,dwtimer值是與從gettickcount函式的返回值相容的值。這是自windows啟動後所經過的毫秒數。 使用這種方法時,相關函式呼叫的形式為:

settimer(hwnd,id_timer,1000,timerproc) ;

killtimer(hwnd,id_timer) ;

方法三:呼叫settimer時不指定視窗控制代碼(為null),itimerid引數自然被忽略,lptimerfunc不為null而指定為timerproc的指標。正如上面settimer的討論中所說的,此時settimer的返回值正是新建立的計時器的id,需將這個id儲存以供killtimer銷毀計時器時所用。當然,killtimer的hwnd引數也置為null。這種方法同樣用timerproc處理wm_timer訊息。

uint_ptr itimerid ;

itimerid = settimer(null,0,1000,timerproc) ;

killtimer(null,itimerid) ;

使用這種方法的好處是不必自己指定計時器id,這樣就不必擔心用錯id。

使用多個計時器

使用多個計時器只要在建立計時器時指定不同的id。比如用上面所述方法一時的情況:

#define timer_sec 1

#define timer_min 2

然後使用兩個settimer來設定兩個計時器:

settimer (hwnd, timer_sec, 1000, null) ;

settimer (hwnd, timer_min, 60000, null) ;

wm_timer的處理如下所示:

case wm_timer:

switch (wparam)

return 0 ;

改變計時器的時間間隔

如果想將乙個已經存在的計時器設定為不同的時間間隔,可以簡單地用不同的時間值再次呼叫settimer。

計時器精確嗎?

計時器並不精確。有兩個原因:

原因一:windows計時器是硬體和rom bios架構下之計時器一種相對簡單的擴充。回到windows以前的ms-dos程式寫作環境下,應用程式能夠通過攔截者稱為timer tick的bios中斷來實現時鐘或計時器。一些為ms-dos編寫的程式自己攔截這個硬體中斷以實現時鐘和計時器。這些中斷每54.915毫秒產生一次,或者大約每秒18.2次。這是原始的ibm pc的微處理器頻率值4.772720 mhz被218所除而得出的結果。在windows 98中,計時器與其下的pc計時器一樣具有55毫秒的解析度。在microsoft windows nt中,計時器的解析度為10毫秒。windows應用程式不能以高於這些解析度的頻率(在windows 98下,每秒18.2次,在windows nt下,每秒大約100次)接收wm_timer訊息。在settimer中指定的時間間隔總是截尾後tick數的整數倍。例如,1000毫秒的間隔除以54.925毫秒,得到18.207個tick,截尾後是18個tick,它實際上是989毫秒。對每個小於55毫秒的間隔,每個tick都會產生乙個wm_timer訊息。

可見,計時器並不能嚴格按照指定的時間間隔傳送wm_timer訊息,它總要相差那麼幾毫秒。

即使忽略這幾個毫秒的差別,計時器仍然不精確。請看原因二:

wm_timer訊息放在正常的訊息佇列之中,和其他訊息排列在一起,因此,如果在settimer中指定間隔為1000毫秒,那麼不能保證程式每1000毫秒或者989毫秒就會收到乙個wm_timer訊息。如果其他程式的執行事件超過一秒,在此期間內,您的程式將收不到任何wm_timer訊息。事實上, windows對wm_timer訊息的處理非常類似於對wm_paint訊息的處理,這兩個訊息都是低優先順序的,程式只有在訊息佇列中沒有其他訊息時才接收它們。

wm_timer還在另一方面和wm_paint相似:windows不能持續向訊息佇列中放入多個wm_timer訊息,而是將多餘的wm_timer訊息組合成乙個訊息。因此,應用程式不會一次收到多個這樣的訊息,儘管可能在短時間內得到兩個wm_timer訊息。應用程式不能確定這種處理方式所導致的wm_timer訊息「遺漏」的數目。

可見,wm_timer訊息並不能及時被應用程式所處理,wm_timer在訊息佇列中的延誤可能就不能用毫秒來計算了。

由以上兩點,你不能通過在處理wm_timer時一秒一秒計數的方法來計時。如果要實現乙個時鐘程式,可以使用系統的時間函式如getlocaltime ,而在時鐘程式中,計時器的作用是定時呼叫getlocaltime獲得新的時間並重新整理時鐘畫面,當然這個重新整理的間隔要等於或小於1秒。

Delphi Timer定時器使用

timer定時器是乙個非視覺化元件,能夠定時觸發ontimer事件,完成模擬時鐘 系統延時 倒計時等工作。在system選項卡中。1 timer的主要屬性 1 enabled屬性 當值為true時,開啟定時器,否則關閉定時器。預設值為true。2 interval屬性 控制ontimer事件觸發的時...

workman定時器使用

workerman 定時器例子,可單獨使用,稍加改善可以開啟乙個守護程序,用來做一些定時發布等等類似的任務,使用方便,不需要額外的擴充套件或者類似 crontab 等工具。以下是測試程式 php view plain copy use workerman autoloader use workerm...

51定時器使用

1.設定特殊功能暫存器tmod,配置好工作模式。tmod中m0 m1的配置決定定時器 0或1 的工作模式。m1 0,m0 0,工作模式0,由thn的8位和tln的5位組成乙個13位的定時器。m1 0,m0 1,工作模式1,由thn和tln組成1個16位的定時器。m1 1,m0 0,工作模式2,8位自...