using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerCore; //============================================================================================= // StopWatch 모듈을 활용한 타이머 기능을 제공하는 클래스 이다. // // author : kangms //============================================================================================= public class StopwatchTimer { private readonly System.Diagnostics.Stopwatch m_stop_watch = new System.Diagnostics.Stopwatch(); private readonly TimeSpan m_interval = default(TimeSpan);// 체크 주기 private readonly bool m_is_manual_restart = false; // 수동 재시작 여부 private bool m_force_on = false; public StopwatchTimer(TimeSpan intreval, bool is_pause = false, bool is_manual_restart = false) { m_interval = intreval; m_is_manual_restart = is_manual_restart; if (is_pause) { pause(); } else { resume(); } } public StopwatchTimer(Int64 interval_milliseconds, bool is_pause = false, bool is_manual_restart = false) : this(new TimeSpan(interval_milliseconds * TimeSpan.TicksPerMillisecond), is_pause, is_manual_restart) { } public StopwatchTimer(float intreval_seconds, bool is_pause = false, bool is_manual_restart = false) : this((Int64)(intreval_seconds * 1000.0f), is_pause, is_manual_restart) { } //========================================================================================= // 지정된 시간 만큼 경과 되었는지 검사한다. //========================================================================================= public bool isOn() { if (m_force_on) { m_force_on = false; } else { if (m_stop_watch.IsRunning == false) { return false; } if (Elapsed < m_interval) { return false; } } if (m_is_manual_restart) { // 한번만 실행되고 멈춘다, 다시 시작하려면, restart를 호출해야 한다. pause(); } else { // 자동리셋이면 재시작 restart(); } return true; } // 강제로 타이머를 On상태로 만든다. public void forceOn() { m_force_on = true; } //========================================================================================= // isOn의 기능과, 경과시간을 얻어온다. //========================================================================================= public bool isOn(out TimeSpan elapsed) { elapsed = Elapsed; return isOn(); } //========================================================================================= // 타이머가 멈춰있는가? //========================================================================================= public bool isPaused() { return m_stop_watch.IsRunning == false; } //========================================================================================= // 타이머가 실행중인가? //========================================================================================= public bool isRunning() { return m_stop_watch.IsRunning; } //========================================================================================= // 일시정지 //========================================================================================= public void pause() { m_stop_watch.Stop(); } //========================================================================================= // 시작 또는 일시정지를 종료하고 다시 시작 //========================================================================================= public void resume() { m_stop_watch.Start(); } //========================================================================================= // 타이머를 초기화하고, 시작 //========================================================================================= public TimeSpan restart() { TimeSpan elapsed = m_stop_watch.Elapsed; m_stop_watch.Reset(); m_stop_watch.Start(); return elapsed; } //========================================================================================= // 경과 시간 조회 //========================================================================================= public TimeSpan Elapsed { get { return m_stop_watch.Elapsed; } } //========================================================================================= // 남은 시간 조회 //========================================================================================= public TimeSpan RemainTime { get { return Elapsed.TotalSeconds > 0 ? (m_interval > Elapsed ? m_interval - Elapsed : new TimeSpan(0)) : new TimeSpan(0); } } }