C#使用Environment.TickCount 自定義的定時器類


 Environment.TickCount,

官網介紹:一個 32 位帶符號整數,它包含自上次啟動計算機以來所經過的時間(以毫秒為單位)。

 

*由於 TickCount 屬性值的值是32位有符號整數,因此,如果系統連續運行,TickCount 將從零遞增到 Int32.MaxValue 大約24.9 天,然后跳轉到 Int32.MinValue,這是一個負數,然后在下一個24.9 天內遞增為零。

我們可以通過實時獲取系統啟動后的毫秒數來實現定時器的定時功能;

首先建立一個Timer類,聲明變量如下:

        enum_State State;//定時器State
        int startTime;       //開始時間
        int endTime;        //結束時間
        int interval;          //定時間隔
        int stopTime;       //停止時間
        int pauseTime;     //暫停時間
        bool outMax;       //是否超出Int32.MaxValue

定時器狀態如下,初始狀態為Idle:

        enum enum_State
        { 
            _Idle,
            _Busy,
            _TimeOut,
            _Stopped,
            _Pause
        }

定時器開始啟動函數,定時參數為整數,單位ms:

        public void Start(int time)
        {
            if (time <= 0)
                time = 1;
            interval = time;
            startTime = Environment.TickCount;
            endTime = startTime + interval;
            State = enum_State._Busy;
            stopTime = 0;
            pauseTime = 0;
            outMax = endTime < startTime;
        }

定時器停止函數:

        public void Stop()
        {
            if (IsBusy() || IsPause())
                stopTime = Environment.TickCount;
            State = enum_State._Stopped;
            endTime = 0;
            pauseTime = 0;
        }

暫停定時器:

        public void Pause()
        {
            if (pauseTime == 0)
                pauseTime = Environment.TickCount;
            State = enum_State._Pause;
        }

繼續定時器:

        public void Resume()
        {
            if (!IsPause())
                return;
            int val = pauseTime;
            startTime = Environment.TickCount - val;
            endTime = startTime + interval;
            State = enum_State._Busy;
            pauseTime = 0;
            stopTime = 0;
            outMax = endTime < startTime;
        }

重置定時器:

        public void Reset()
        {
            interval = 0;
            startTime = 0;
            endTime = 0;
            pauseTime = 0;
            stopTime = 0;
            State = enum_State._Idle;
        }

判斷是否超時:

        public bool IsTimeOut()
        {
            int ticks = Environment.TickCount;
            if (outMax)
            {
                if (ticks < startTime)
                    outMax = false;
            }
            if (!outMax && !IsPause())
            {
                if (IsBusy() && (ticks > endTime || ticks <= 0 && endTime > 0 && startTime > 0))
                {
                    stopTime = endTime;
                    State = enum_State._TimeOut;
                }
            }
            return State == enum_State._TimeOut;
        }

下面在程序中實例化一個Timer類timer1,並實現定時2s發送消息:

        public void Monitor()
        {
            timer1.Start(2*1000);
            while (true)
            {
                Thread.Sleep(10);
                //int i = Thread.CurrentThread.ManagedThreadId;
                if (timer1.IsTimeOut())
                {
                    comUp.comPort_SendData(textBox_ComSend.Text);
                    timer1.Start(2*1000);
                }
            }
        }

看一下定時效果:

因為調用Winform窗台顯示,線程執行,邏輯判斷等需要一些時間,所以顯示有一些偏差;

如官網介紹,使用Environment.TickCount時,注意24.9天左右會達到Int32.MaxValue,然后跳轉到Int32.MinValue,再經過24.9天達到0,要注意對負數的處理;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM