關于WM_TIMER有兩點將會在此文章中說明:
(1) WM_TIMER響應沖突
(2) 時間的精確性
(1) WM_TIMER響應沖突:即多個WM_TIMER同時到達時的處理
首先,WM_TIMER這個消息的優先級很低,類似的還有WM_PAINT消息。只有在消息隊列里面沒有其他消息的時候,才會執行這兩個消息。
以下是EVC4幫助中的原話:The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions retrieve this message only when no other higher-priority messages are in the thread’s message queue.
這段時間,在CSDN的 硬件/嵌入開發>嵌入開發(WinCE)中,就在討論TIMER這個消息,具體的內容見:
http://topic.csdn.net/u/20071205/10/f97d8fed-3ea9-4a7f-a2e0-3b707f4ca264.html
網上有這樣一段話(不是權威):
[多個WM_TIMER同時到達時,WM_TIMER是會產生的,不過如果多個相同WM_TIMER排在一起,會被合并。]這個說法,符合上面帖子中實際測試得到的結果。
但是另一段話是這樣的:
[消息隊列里面不會載入多個WM_TIMER。WINDOWS會將消息隊列只保留一個WM_TIMER,舍棄其他的WM_TIMER。] 但是沒有說,對WM_TIMER消息是如何處理的!
所以,根據帖子中實測的結果與上述文字可以得到以下結論:消息隊列里面不會載入多個WM_TIMER;如果多個相同WM_TIMER排在一起,會被合并執行最后一個WM_TIMER對應的功能。
***歡迎大家來討論此問題,上述結論不一定正確噢!
(2) WM_TIMER在時間上的精確性
對WM_TIMER精度的研究,源于秒表功能的實現。
剛開始采用WM_TIMER做為秒表的驅動源,測試發現秒表走一段時間后,就不準了。
當然這一段時間,根據MW_TIMER的越時時間不同而不同。超時時間段越小,這段時間越短;超時時間越長,這段時間也越長。但是即使使用1秒的間隔,也是不行的。
[WM_TIMER精度大約為55ms,用來做簡單的動畫效果倒夠用,但稍微高一點要求的就難了。]
WM_TIMER單次的精度,一般大家在使用的時候,不太注意,時間差不多就可以了。但多次WM_TIMER的累積后,精確度不準是很明顯的。
最后無奈的放棄了使用SetTimer()的想法。
在網上查找,發現VC下有多媒體定時器,是一個精度比較高的定時器。例如其函數timeSetEvent(),可是在EVC4的幫助文件中,竟然沒有找到它的幫助。直接暈倒......
但是經測試發現,EVC中timeSetEvent()及相關的函數是可以正常使用的。又是一個沒有在幫助中說明的函數!
使用多媒體定時器,最終實現了秒表的功能。