關於定時器

2021-04-02 11:15:19 字數 2097 閱讀 8894

定時器是個很有意思的東西,它很有用,但我認為這不是現代計算機的結構所擅長的事情。

計算機適合做那些很大量的簡單重複工作,或者根據請求做出回應。

dos時代是沒有程序執行緒等概念的,那時候要想做到定時真是有些麻煩

通常的做法是死迴圈不斷監測時間,發現時間到了就做特定的事情

當然你可以用delay,來指定等待多長時間,但是如果你一邊要響應使用者的操作,比如輸入,一邊要定時做些

事情就是一件麻煩的事了

當然有些人可以這樣做,擷取系統的時鐘中斷(我忘了中斷號是多少了),每秒鐘有18.2次

當這些做法都不是很優雅。但dos時代只能這樣湊合著了

windows是個偉大的進步,系統提供了timer支援,但是問題是這個定時器並不准時而且有時候根本不能用。

win32 api中有個settimer函式,可以為乙個視窗建立乙個定時器,這個定時器會定時產生訊息wm_timer也可以呼叫

指定的**函式,其實這都是一樣的,因為都是單執行緒的。

單執行緒的定時器會有很多問題,首先是不准時,定時器只是定時把訊息wm_timer訪到執行緒的訊息佇列裡,但是並不保證訊息會立刻被響應,如果

碰巧系統比較忙,那麼訊息可能會在佇列裡放一端時間才被響應,還會造成本來應該間隔一段時間發生的訊息響應連續發生了

解決方法通常是

ontimer(...)

在當前timer處理中,把訊息佇列裡的wm_timer訊息,清除掉。

更糟的是如果你不去呼叫getmessage,那麼就不會有timer發生了。

這個問題直到win xp都沒什麼改變,似乎微軟並不打算在win32 api中解決這個問題了。

.net framework為我們帶來了新的解決方案

.net framework提供三種timer

server timers        system.timers.timer

thread timers       system.threading.timer

windows timers   system.windows.forms.timer

其中windows timers只是提供了和winapi 一樣的timer,仍然是基於訊息,仍然是單執行緒

其它兩個就不同了,他們是基於執行緒池的thread pool,這樣最大的好處在於,產生的時間間隔準確均勻。

server timers  和 thread timers 的不同在於servertimers 是基於事件的,thread timers是基於**函式

我更喜歡thread timer,比較輕量級方便易用。

但是這樣的timer也有問題,就是由於時多執行緒定時器,就會出現如果乙個timer處理沒有完成,到了時間下乙個

照樣會發生,這就會導致重入問題

對付重入問題通常的辦法是加鎖,但是對於 timer卻不能簡單的這樣做,你需要評估一下

首先timer處理裡本來就不應該做太需要時間的事情,或者花費時間無法估計的事情,比同遠方的伺服器建立乙個網路連線,這樣的做法盡量避免

如果實在無法避免,那麼要評估timer處理超時是否經常發生,如果是很少出現,那麼可以用lock(object)的方法來防止重入

如果這種情況經常出現呢?那就要用另外的方法來防止重入了

static  int intimer = 0;

public static void threadtimercallback(object obj)

, /tthread id:", datetime.now, thread.currentthread.gethashcode());

thread.sleep(2000);

intimer = 0;}}

但是在多執行緒下給intimer賦值不夠安全,還好interlocked.exchange提供了一種輕量級的執行緒安全的給物件賦值的方法

static int intimer = 0;

public static void threadtimercallback(object obj)

, /tthread id:", datetime.now, thread.currentthread.gethashcode());

thread.sleep(250);

interlocked.exchange(ref intimer, 0);}}

關於定時器

今天突然想到乙個問題,如果要設定乙個5分鐘的定時器,那麼時間使用5 minute和5 60 second有什麼區別呢?或者說,設定成後者,程式會不會更累呢,會不會每秒鐘都去檢查下是不是到期了?於是去翻了一下golang原始碼中time的newtimer部分,如下 原來人家這兒用的是duration,...

關於didadida 定時器

在學習 定時器 之前,我們先來清楚的了解定時器的應用需求,或者場合。當需要在一段規定的時間內完成某些操作時,就需要有乙個精準的定時工具來提醒你更好的去完成。我自己理解的是 定時 是,在規定好的時間一旦到了,就自動 醒來 一次,當然,可以給這個過程啟動乙個執行緒。我覺得他更多起到的是乙個 提醒 的作用...

關於 時間和定時器

這些東西 本來感覺沒有什麼搞得必要 但是 感覺很多書 都介紹了一些 我也就跟著做一下吧。獲取系統的時間 這個 應該是是最簡單的 直接看 就ok include stdafx.h include int tmain int argc,tchar ar 關於 systemtime 這個結構體 可以直接看...