執行緒分離的定時器一點經驗

2021-07-09 02:34:52 字數 1411 閱讀 1300

說道定時器,很多人都會想到windows定時器settimer吧!其實,專案裡面原本確實是使用這種方法實現動畫效果的,但是後來問題出現了!由於wm_timer訊息優先順序比較低,常常被丟失,導致乙個wm_mousemove訊息都會影響整個動畫的效果。

這時我就考慮,是否能給定時器建立乙個單獨的執行緒,接著就發現了「多**定時器」這個東西。它是乙個高精確度定時器,一般的windows定時器只能精確到55ms,而多**定時器能精確到10ms內。同時,在啟動乙個多**定時器的同時,會自動建立乙個執行緒,專門負責定時器控制。不僅如此,多**計時器具有較高的優先順序(記得是15),因此能夠滿足實時控制的需求。但是這也為它帶來了不利的因素,同時對於定時器響應函式的內容也有一些限制,具體情況有時間再詳細說明下!

為了學會使用它,我研究了很多相關資料,其中經典的算《c++builder 深度歷險》這本書了。嘿嘿~ 閒暇的時間看了下c++builder,又收穫了一些其它知識。

首先,簡要介紹下幾個重要的函式,具體說明見msdn!

1)mmresult timegetdevcaps( lptimecaps ptc, uint cbtc );

功能:獲得計時器所支援的解析度範圍。

2)mmresult timebeginperiod( uint uperiod );

功能:調整計時器的解析度,用在啟動計時器之前。

3)mmresult timeendperiod( uint uperiod );

功能:調整計時器的解析度,用在結束計時器之後。這兩個函式通常是成對出現。

4)mmresult timesetevent( uint udelay, uint uresolution, lptimecallback lptimeproc, dword_ptr dwuser, uint fuevent );

功能:設定並啟動乙個計時器

5)mmresult timekillevent( uint utimerid );

功能:取消乙個定時器

好了!廢話不多少,直接跳到使用方法階段:

1)設定並啟動定時器

1   if (timebeginperiod(5) == timerr_noerror )

2   

2)取消定時器

1 timekillevent(m_utimerid);

2 timeendperiod(5);

3)定時器處理函式

1 void _stdcall timeproc(uint utimerid,uint umessage,dword dwuser,dword dw1,dword dw2)

2 tip:  定時器處理函式一般定義為全域性函式,而函式內部使用的方法也只能是全域性變數或函式!

最後,不要忘記加上以下標頭檔案和動態鏈結庫:

1 #pragma comment(lib,"winmm.lib")

2 3 #include

爬蟲的一點經驗

1.寫乙個網頁爬蟲的時候遇到了乙個div巢狀問題,即乙個大的div裡面有很多小的div,如 xx x 這樣乙個型別,如果爬取內層的div是很簡單的,正規表示式十分好寫 div 但是如果要爬取外面的div該怎麼辦呢?當時我的做法是繼續尋找,找出該段內容後面的具有識別該段內容能力的內容。如上式,在正規表...

學習 iOS Autolayout的一點經驗

以下是最近在學習autolayout的過程中學到的一些東西,全出於自己的理解,不對的地方望大家指出。對於普通的檢視uiview來說,想要正確完成檢視的布局,就得建立足夠的約束,普通檢視無法計算自身的寬高,所以在建立約束時,要麼新增關於檢視寬高的約束,要麼新增足夠的其他約束,保證這些檢視可以計算出自身...

雜談學習的一點經驗

在面對乙個新的東西時,首先要甄別學習的目的和價值。我們要能判斷是不是值得學習,或者說我學了會不會它之後,會不會用到。如果是要學,需要怎麼學?學到什麼程度。有的只是需要了解,知道就行,不需要花費太多時間。有的需要掌握原理,需要專心投入時間和精力研究。在確定要學習後,就要想方設法讓自己知其然,也要知其所...