EVC編程點滴-WM_TIMER衝突處理與精度

來源:互聯網
上載者:User

關於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()及相關的函數是可以正常使用的。又是一個沒有在協助中說明的函數!
使用多媒體定時器,最終實現了秒錶的功能。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.