• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            關于定時器

            http://www.iwms.net/n1251c13.aspx

            定時器是個很有意思的東西,它很有用,但我認為這不是現代計算機的結構所擅長的事情。
            計算機適合做那些很大量的簡單重復工作,或者根據請求做出回應。

            DOS時代是沒有進程線程等概念的,那時候要想做到定時真是有些麻煩
            通常的做法是死循環不斷監測時間,發現時間到了就做特定的事情
            當然你可以用delay,來指定等待多長時間,但是如果你一邊要響應用戶的操作,比如輸入,一邊要定時做些
            事情就是一件麻煩的事了

            當然有些人可以這樣做,截取系統的時鐘中斷(我忘了中斷號是多少了),每秒鐘有18.2次
            當這些做法都不是很優雅。但DOS時代只能這樣湊合著了

            Windows是個偉大的進步,系統提供了Timer支持,但是問題是這個定時器并不準時而且有時候根本不能用。

            Win32 API中有個SetTimer函數,可以為一個窗口創建一個定時器,這個定時器會定時產生消息WM_TIMER也可以調用
            指定的回調函數,其實這都是一樣的,因為都是單線程的。

            單線程的定時器會有很多問題,首先是不準時,定時器只是定時把消息WM_TIMER訪到線程的消息隊列里,但是并不保證消息會立刻被響應,如果
            碰巧系統比較忙,那么消息可能會在隊列里放一端時間才被響應,還會造成本來應該間隔一段時間發生的消息響應連續發生了

            解決方法通常是

            OnTimer(...)
            {
             //Timer process.....
             
             MSG msg;
             While(PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE));
            }
            在當前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)的方法來防止重入
            如果這種情況經常出現呢?那就要用另外的方法來防止重入了

            我們可以設置一個標志,表示一個Timer處理正在執行,下一個Timer發生的時候發現上一個沒有執行完就放棄執行

            static  int inTimer = 0;
            public static void threadTimerCallback(Object obj)
            {
                 if ( inTiemr == 0 )
                {
                     inTimer = 1;         

                     Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
                     Thread.Sleep(2000);

                     inTimer = 0;
                  }
            }

            但是在多線程下給inTimer賦值不夠安全,還好Interlocked.Exchange提供了一種輕量級的線程安全的給對象賦值的方法

             static int inTimer = 0;
             public static void threadTimerCallback(Object obj)
             {
                   if ( Interlocked.Exchange(ref inTimer, 1) == 0 )
                  {
                       Console.WriteLine("Time:{0}, \tThread ID:{1}", DateTime.Now, Thread.CurrentThread.GetHashCode());
                       Thread.Sleep(250);

                       Interlocked.Exchange(ref inTimer, 0);
                  }
             }

            posted on 2013-12-18 19:29 多彩人生 閱讀(372) 評論(0)  編輯 收藏 引用

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品aⅴ无码中文字字幕不卡| 99久久免费国产精品特黄| 99久久人妻无码精品系列| 国内精品久久久久伊人av| 久久婷婷国产麻豆91天堂| 久久久久亚洲精品天堂久久久久久 | 亚洲色婷婷综合久久| 亚洲精品国产美女久久久| 久久久久久久人妻无码中文字幕爆| 国产亚洲精品自在久久| 久久精品99无色码中文字幕| 国内精品九九久久精品| 久久美女网站免费| 亚洲香蕉网久久综合影视| 91精品国产高清久久久久久国产嫩草 | 国产一区二区精品久久岳| 精品久久亚洲中文无码| 国产成人精品综合久久久| 亚洲级αV无码毛片久久精品| 大美女久久久久久j久久| 性欧美丰满熟妇XXXX性久久久| 精品水蜜桃久久久久久久| 久久综合精品国产二区无码| 亚洲精品国产自在久久| 精品久久综合1区2区3区激情| 久久久久久亚洲精品成人| 99久久精品国产一区二区 | 久久夜色精品国产欧美乱| 武侠古典久久婷婷狼人伊人| 天天爽天天爽天天片a久久网| 久久久久久毛片免费播放| 狠狠综合久久AV一区二区三区 | .精品久久久麻豆国产精品| 久久亚洲日韩看片无码| 久久久久黑人强伦姧人妻| 久久精品国产精品青草app| 97久久国产亚洲精品超碰热| 久久精品麻豆日日躁夜夜躁| 色综合久久久久综合体桃花网| 一本色道久久99一综合| 久久99久国产麻精品66|