244 lines
4.2 KiB
C#
244 lines
4.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
namespace ServerCore;
|
|
|
|
//=============================================================================================
|
|
// 간단한 로직을 위한 타이머 클래스 이다.
|
|
//
|
|
// author : kangms
|
|
//
|
|
//=============================================================================================
|
|
|
|
public class SimpleTimer
|
|
{
|
|
private DateTime m_begin_timestamp = DateTime.MinValue;
|
|
private DateTime m_end_timestamp = DateTime.MinValue;
|
|
|
|
private Int64 m_time_limit_msec = 0;
|
|
|
|
private bool m_is_paused = false;
|
|
private DateTime m_pause_timestamp = new DateTime();
|
|
private Int64 m_pause_total_msec = 0;
|
|
|
|
private bool m_active = false;
|
|
|
|
public SimpleTimer()
|
|
{
|
|
}
|
|
|
|
public SimpleTimer(Int64 timeLimitMSec)
|
|
{
|
|
setTimeLimitMSec(timeLimitMSec);
|
|
}
|
|
|
|
public void setTimer(Int64 timeLimitMSec)
|
|
{
|
|
setTimer(0, timeLimitMSec);
|
|
}
|
|
|
|
public void setTimer(Int64 beginUtcTick, Int64 timeLimitMSec)
|
|
{
|
|
m_begin_timestamp = beginUtcTick > 0 ? new DateTime(beginUtcTick) : DateTime.UtcNow;
|
|
m_time_limit_msec = timeLimitMSec;
|
|
|
|
m_is_paused = false;
|
|
m_pause_total_msec = 0;
|
|
|
|
m_end_timestamp = DateTime.MinValue;
|
|
}
|
|
|
|
public void activate(Int64 timeLimitMSec = 0)
|
|
{
|
|
m_active = true;
|
|
if (timeLimitMSec != 0)
|
|
{
|
|
setTimer(0, timeLimitMSec);
|
|
}
|
|
else
|
|
{
|
|
reset(0);
|
|
}
|
|
}
|
|
|
|
public void activate(Int64 beginUtcTick, Int64 timeLimitMSec = 0)
|
|
{
|
|
m_active = true;
|
|
if (timeLimitMSec != 0)
|
|
{
|
|
setTimer(beginUtcTick, timeLimitMSec);
|
|
}
|
|
else
|
|
{
|
|
reset(beginUtcTick);
|
|
}
|
|
}
|
|
|
|
public bool isActive()
|
|
{
|
|
return m_active;
|
|
}
|
|
|
|
public void deactivate()
|
|
{
|
|
m_active = false;
|
|
m_end_timestamp = DateTime.UtcNow;
|
|
}
|
|
|
|
public void setTimeLimitMSec(Int64 limitMSec)
|
|
{
|
|
m_time_limit_msec = limitMSec;
|
|
|
|
m_time_limit_msec = Math.Max(m_time_limit_msec, 0);
|
|
}
|
|
|
|
public void incTimeLimitMSec(Int64 incMSec)
|
|
{
|
|
m_time_limit_msec += incMSec;
|
|
|
|
m_time_limit_msec = Math.Max(m_time_limit_msec, 0);
|
|
}
|
|
|
|
public Int64 getTimeLimitMSec()
|
|
{
|
|
return m_time_limit_msec;
|
|
}
|
|
|
|
public void reset()
|
|
{
|
|
setTimer(m_time_limit_msec);
|
|
}
|
|
|
|
public void reset(Int64 beginUtcTick)
|
|
{
|
|
setTimer(beginUtcTick, m_time_limit_msec);
|
|
}
|
|
|
|
public bool expired()
|
|
{
|
|
if (false == isActive())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (true == isPause())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return (DateTime.UtcNow - m_begin_timestamp).TotalMilliseconds > (m_pause_total_msec + m_time_limit_msec);
|
|
}
|
|
|
|
public void pause()
|
|
{
|
|
if (isPause())
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_is_paused = true;
|
|
m_pause_timestamp = DateTime.UtcNow;
|
|
}
|
|
|
|
public bool isPause()
|
|
{
|
|
return m_is_paused;
|
|
}
|
|
|
|
public void unpause()
|
|
{
|
|
if (false == isPause())
|
|
{
|
|
return;
|
|
}
|
|
|
|
var pause_time = (DateTime.UtcNow - m_pause_timestamp).TotalMilliseconds;
|
|
m_pause_total_msec += (Int64)pause_time;
|
|
|
|
m_is_paused = false;
|
|
}
|
|
|
|
public Int64 getTotalTimeMSec()
|
|
{
|
|
if (!isActive())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var end_time = m_begin_timestamp.AddMilliseconds(m_time_limit_msec);
|
|
|
|
var total_time = (end_time - m_begin_timestamp).TotalMilliseconds;
|
|
|
|
total_time = Math.Max(total_time, 0);
|
|
|
|
return (Int64)total_time;
|
|
}
|
|
|
|
public Int64 getElapsedPauseTimeMSec()
|
|
{
|
|
if (false == isActive())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var pause_time = m_pause_total_msec;
|
|
|
|
if (true == isPause())
|
|
{
|
|
pause_time += (Int64)((DateTime.UtcNow - m_pause_timestamp).TotalMilliseconds);
|
|
}
|
|
|
|
pause_time = Math.Max(pause_time, 0);
|
|
|
|
return (Int64)pause_time;
|
|
}
|
|
|
|
public bool isOn()
|
|
{
|
|
if (false == expired())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
reset();
|
|
|
|
return true;
|
|
}
|
|
|
|
public DateTime getStartedTime() => m_begin_timestamp;
|
|
public DateTime getEndTime() => m_end_timestamp;
|
|
|
|
public Int64 getRemainTimeMSec()
|
|
{
|
|
if (false == isActive())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
var pause_time = getElapsedPauseTimeMSec();
|
|
|
|
TimeSpan time_span = DateTime.UtcNow - m_begin_timestamp;
|
|
var remain_time = m_time_limit_msec + pause_time - (Int64)time_span.TotalMilliseconds;
|
|
remain_time = Math.Max(remain_time, 0);
|
|
|
|
return remain_time;
|
|
}
|
|
|
|
public Int64 getElapsedTimeMSec()
|
|
{
|
|
if (false == isActive())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
TimeSpan time_span = DateTime.UtcNow - m_begin_timestamp;
|
|
return (Int64)time_span.TotalMilliseconds;
|
|
}
|
|
|
|
}
|