C\#고정 밀 타이머 만 들 기 예시
우 리 는.NET Framework 에 네 가지 자주 사용 하 는 타이머 가 존재 한 다 는 것 을 알 고 있다.그들 은 각각 다음 과 같다.
1 두 개 는 일반적인 다 중 스 레 드 타이머 입 니 다.
이루어지다
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
 
namespace Pangea.Common.Utility
{
    /// <summary>
    /// .Net Stopwatch              
    /// DeviceTimer    Stopwatch          
    /// </summary>
    public sealed class DeviceTimer
    {
#if USE_CPU_COUNTING
        //        API,   CPU      
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
 
        //    CPU     
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(out long lpFrequency);
#else
        /// <summary>
        ///   TickCount64  
        /// </summary>
        /// <returns></returns>
        //[DllImport("kernel32.dll")]
        //public static extern long GetTickCount64();
#endif
        private enum DeviceTimerState
        {
            TM_ST_IDLE = 0,
            TM_ST_BUSY = 1,
            TM_ST_TIMEOUT = 2,
        }
 
        /// <summary>
        /// Stopwatch object
        /// </summary>
        Stopwatch _stopWatch = new Stopwatch();
 
        /// <summary>
        ///        
        /// </summary>
        DeviceTimerState _state;
 
        /// <summary>
        ///                
        /// </summary>
        long _startTime;
 
        /// <summary>
        ///              
        /// </summary>
        long _timeOut;
 
#if USE_CPU_COUNTING
 
        /// <summary>
        /// CPU       
        /// </summary>
        double _freq;
#endif
 
        /// <summary>
        ///     (  :ms)
        /// </summary>
        double _duration;
 
        /// <summary>
        /// class constructure
        /// </summary>
        public DeviceTimer()
        {
#if USE_CPU_COUNTING
            long freq;
            if (QueryPerformanceFrequency(out freq) == false)
                throw new Exception("             ");
            //   1ms CPU  TickCount  
            _freq = (double)freq / 1000.0;
            QueryPerformanceCounter(out _startTime);
#else
            _stopWatch.Start();
            _startTime = 0;
#endif
            SetState(DeviceTimerState.TM_ST_IDLE);
            _timeOut = _startTime;
            _duration = 0;
        }
 
        /// <summary>
        ///     :         
        /// </summary>
        /// <param name="state"></param>
        private void SetState(DeviceTimerState state)
        {
            _state = state;
        }
 
        /// <summary>
        ///     :         
        /// </summary>
        /// <returns></returns>
        private DeviceTimerState GetState()
        {
            return _state;
        }
 
        /// <summary>
        ///                 (  :  )
        /// </summary>
        /// <returns></returns>
        public double GetElapseTime()
        {
            long curCount;
#if USE_CPU_COUNTING
            QueryPerformanceCounter(out curCount);
            return (double)(curCount - _startTime) / (double)_freq;
#else
            curCount = _stopWatch.ElapsedMilliseconds;
            return curCount - _startTime;
#endif
        }
 
        /// <summary>
        ///        
        /// </summary>
        /// <returns></returns>
        public double GetTotalTime()
        {
            return _duration;
        }
 
        /// <summary>
        ///        
        /// </summary>
        public void Stop()
        {
            SetState(DeviceTimerState.TM_ST_IDLE);
#if USE_CPU_COUNTING
            QueryPerformanceCounter(out _startTime);
#else
            _startTime = _stopWatch.ElapsedMilliseconds;
#endif
            _timeOut = _startTime;
            _duration = 0;
        }
 
        /// <summary>
        ///      
        /// </summary>
        /// <param name="delay_ms">    (  :  )</param>
        public void Start(double delay_ms)
        {
#if USE_CPU_COUNTING
            QueryPerformanceCounter(out _startTime);
            _timeOut = Convert.ToInt64(_startTime + delay_ms * _freq);
#else
            _startTime = _stopWatch.ElapsedMilliseconds;
            _timeOut = Convert.ToInt64(_startTime + delay_ms);
#endif
            SetState(DeviceTimerState.TM_ST_BUSY);
            _duration = delay_ms;
        }
 
        /// <summary>
        ///        
        ///            Start     
        /// </summary>
        /// <param name="delay_ms">    (  :  )</param>
        public void Restart(double delay_ms)
        {
#if USE_CPU_COUNTING
            _timeOut = Convert.ToInt64(_startTime + delay_ms * _freq);
#else
            _timeOut = Convert.ToInt64(_startTime + delay_ms);
#endif
            SetState(DeviceTimerState.TM_ST_BUSY);
            _duration = delay_ms;
        }
 
        /// <summary>
        ///          
        /// </summary>
        /// <returns></returns>
        public bool IsTimeout()
        {
            if (_state == DeviceTimerState.TM_ST_IDLE)
            {
                //System.Diagnostics.Debug.WriteLine("Warning: Misuage of the device timer. You must start it first before you can use it.");
                //System.Diagnostics.Debug.Assert(false, "Warning: Misuage of the device timer. You must start it first before you can use it.");
            }
            long curCount;
#if USE_CPU_COUNTING
            QueryPerformanceCounter(out curCount);
#else
            curCount = _stopWatch.ElapsedMilliseconds;
#endif
            if (_state == DeviceTimerState.TM_ST_BUSY && (curCount >= _timeOut))
            {
                SetState(DeviceTimerState.TM_ST_TIMEOUT);
                return true;
            }
            else if (_state == DeviceTimerState.TM_ST_TIMEOUT)
            {
                return true;
            }
            return false;
        }
 
        /// <summary>
        ///          
        /// </summary>
        /// <returns></returns>
        public bool IsIdle()
        {
            return (_state == DeviceTimerState.TM_ST_IDLE);
        }
    }
}이 안에서 우 리 는 DeviceTimer 에서 개인 적 인 을 정의 했다.stopWatch 대상 과 구조 함수 에서 이 Stopwatch 를 시 작 했 습 니 다.그래서 우 리 는 사용 할 때 DeveiceTimer 대상 을 만 든 다음 에 내부 의 Start 방법 을 호출 합 니 다.물론 이 방법 을 호출 할 때 우 리 는 정시 시간 을 입력 한 다음 에 IsTimeout 방법 이 정시 시간 에 도 착 했 는 지 계속 검 측 해 야 합 니 다.따라서 정시 시간 과 유사 한 효 과 를 얻 을 수 있 습 니 다.또한 GetElapseTime()방법 은 Start 방법 을 호출 하 는 것 부터 지금까지 의 시간 을 얻 을 수 있 습 니 다.또한 우 리 는 그 중에서 몇 개의 매 거 진 값 을 정의 하여 현재 DeviceTimer 의 상 태 를 표시 하여 일부 상 태 를 검사 하 는 데 사용 할 수 있 습 니 다.구체 적 인 수 치 는 다음 과 같 습 니 다.
private enum DeviceTimerState
{
    TM_ST_IDLE = 0,
    TM_ST_BUSY = 1,
    TM_ST_TIMEOUT = 2,
}여기 서 마지막 문 제 는 바로 순환 호출 문제 입 니 다.이것 도 아주 간단 합 니 다.While 순환 에서 계속 호출 되 고 있 습 니 다.물론 아래 의 코드 는 우리 가 발휘 할 수 있 는 많은 내용 이 있 습 니 다.이것 은 자신의 수요 에 따라 수정 할 수 있 습 니 다.
using System;
using System.Threading.Tasks;
 
namespace DeviceTimerConsoleApp
{
    class Program
    {
        private static bool flag = true;
        static void Main(string[] args)
        {
            Task.Factory.StartNew(() =>
            {
                var deviceTimer = new DeviceTimer();
                deviceTimer.Start(5);
 
                while (flag)
                {
                    if (deviceTimer.IsTimeout())
                    {
                        Console.WriteLine($"      ,         :{deviceTimer.GetElapseTime()}ms");
 
                        deviceTimer.Start(5);
                    }
                }
            });
            Console.ReadKey();
        }
    }
     
}타이머 효과 한번 볼 게 요.
 이상 은 C\#고정 밀 타 이 머 를 만 드 는 예제 의 상세 한 내용 입 니 다.C\#고정 밀 타 이 머 를 만 드 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.