Windows系統(tǒng)三種定時(shí)器的分析
目前,Windows下的定時(shí)器編程主要有三種方式。
1)SetTimer定時(shí)器是利用Windows窗口消息WM_TIMER來(lái)實(shí)現(xiàn)的。使用方法非常簡(jiǎn)單,SetTimer創(chuàng)建定時(shí)器,KillTimer銷(xiāo)毀定時(shí)器。使用條件是調(diào)用線程必須要有窗口消息隊(duì)列message queue,因此如果是工作線程就無(wú)法使用這種方法。
2)WaitableTimer定時(shí)器,其實(shí)應(yīng)該算是一種線程同步對(duì)象,CreateWaitableTimer創(chuàng)建定時(shí)器對(duì)象,SetWaitableTimer設(shè)置定時(shí)器回調(diào)函數(shù),CLoseHandle銷(xiāo)毀定時(shí)器。WaitableTimer可以跨線程、進(jìn)程使用,只要知道定時(shí)器對(duì)象名字(創(chuàng)建定時(shí)器時(shí)設(shè)置)就可以控制該定時(shí)器對(duì)象了。WaitableTimer定時(shí)器的回調(diào)函數(shù)實(shí)際上是一個(gè)APC(Asynchronous Procedure Calls)異步過(guò)程調(diào)用函數(shù)。
關(guān)于APC方面的知識(shí)可參考“談?wù)剬?duì)APC的一點(diǎn)理解”一文http://blog.csdn.net/wwwwly/archive/2009/07/10/4337907.aspx
3)TimerQueueTimer定時(shí)器,應(yīng)該算迄今為止Windows系統(tǒng)最強(qiáng)大的定時(shí)器了。他可以支持多種工作模式,而且定時(shí)精度也是最高的。
使用時(shí),首先要調(diào)用CreateTimerQueue創(chuàng)建一個(gè)定時(shí)器隊(duì)列,然后用
CreateTimerQueueTimer來(lái)創(chuàng)建一個(gè)TimerQueueTimer定時(shí)器,
WT_EXECUTEDEFAULT,默認(rèn)設(shè)置,回調(diào)函數(shù)將進(jìn)入一個(gè)非I/O工作線程隊(duì)列
WT_EXECUTEINTIMERTHREAD,回調(diào)函數(shù)作為APC,在定時(shí)器線程中被調(diào)用,被調(diào)用的條件是線程進(jìn)入可警告等待狀態(tài)alertable wait status。僅適用于短時(shí)任務(wù),否則可能會(huì)影響隊(duì)列中的其他定時(shí)器。
WT_EXECUTEINIOTHREAD,回調(diào)函數(shù)進(jìn)入一個(gè)I/O工作線程隊(duì)列,
請(qǐng)注意,大多數(shù)定時(shí)器都需要調(diào)用線程進(jìn)入可警告等待狀態(tài)alertable wait status,并不是隨隨便便就能發(fā)生定時(shí)調(diào)用的。一個(gè)線程是否進(jìn)入可警告等待狀態(tài)可參見(jiàn)微軟的說(shuō)明http://msdn.microsoft.com/en-us/library/ms686307.aspx
A thread goes into an alertable wait state by calling either SleepEx, MsgWaitForMultipleObjectsEx, WaitForSingleObjectEx, or WaitForMultipleObjectsEx, with the function's bAlertable parameter set to TRUE.
所以希望定時(shí)器不受這種可警告等待狀態(tài)的影響,最好是用TimerQueue來(lái)完成。
目前,Windows下的定時(shí)器編程主要有三種方式。
1)SetTimer定時(shí)器是利用Windows窗口消息WM_TIMER來(lái)實(shí)現(xiàn)的。使用方法非常簡(jiǎn)單,SetTimer創(chuàng)建定時(shí)器,KillTimer銷(xiāo)毀定時(shí)器。使用條件是調(diào)用線程必須要有窗口消息隊(duì)列message queue,因此如果是工作線程就無(wú)法使用這種方法。
2)WaitableTimer定時(shí)器,其實(shí)應(yīng)該算是一種線程同步對(duì)象,CreateWaitableTimer創(chuàng)建定時(shí)器對(duì)象,SetWaitableTimer設(shè)置定時(shí)器回調(diào)函數(shù),CLoseHandle銷(xiāo)毀定時(shí)器。WaitableTimer可以跨線程、進(jìn)程使用,只要知道定時(shí)器對(duì)象名字(創(chuàng)建定時(shí)器時(shí)設(shè)置)就可以控制該定時(shí)器對(duì)象了。WaitableTimer定時(shí)器的回調(diào)函數(shù)實(shí)際上是一個(gè)APC(Asynchronous Procedure Calls)異步過(guò)程調(diào)用函數(shù)。
關(guān)于APC方面的知識(shí)可參考“談?wù)剬?duì)APC的一點(diǎn)理解”一文http://blog.csdn.net/wwwwly/archive/2009/07/10/4337907.aspx
3)TimerQueueTimer定時(shí)器,應(yīng)該算迄今為止Windows系統(tǒng)最強(qiáng)大的定時(shí)器了。他可以支持多種工作模式,而且定時(shí)精度也是最高的。
使用時(shí),首先要調(diào)用CreateTimerQueue創(chuàng)建一個(gè)定時(shí)器隊(duì)列,然后用
CreateTimerQueueTimer來(lái)創(chuàng)建一個(gè)TimerQueueTimer定時(shí)器,
WT_EXECUTEDEFAULT,默認(rèn)設(shè)置,回調(diào)函數(shù)將進(jìn)入一個(gè)非I/O工作線程隊(duì)列
WT_EXECUTEINTIMERTHREAD,回調(diào)函數(shù)作為APC,在定時(shí)器線程中被調(diào)用,被調(diào)用的條件是線程進(jìn)入可警告等待狀態(tài)alertable wait status。僅適用于短時(shí)任務(wù),否則可能會(huì)影響隊(duì)列中的其他定時(shí)器。
WT_EXECUTEINIOTHREAD,回調(diào)函數(shù)進(jìn)入一個(gè)I/O工作線程隊(duì)列,
請(qǐng)注意,大多數(shù)定時(shí)器都需要調(diào)用線程進(jìn)入可警告等待狀態(tài)alertable wait status,并不是隨隨便便就能發(fā)生定時(shí)調(diào)用的。一個(gè)線程是否進(jìn)入可警告等待狀態(tài)可參見(jiàn)微軟的說(shuō)明http://msdn.microsoft.com/en-us/library/ms686307.aspx
A thread goes into an alertable wait state by calling either SleepEx, MsgWaitForMultipleObjectsEx, WaitForSingleObjectEx, or WaitForMultipleObjectsEx, with the function's bAlertable parameter set to TRUE.
所以希望定時(shí)器不受這種可警告等待狀態(tài)的影響,最好是用TimerQueue來(lái)完成。


