code : http://damody.googlecode.com/files/TTimer.7z

感覺可能有小錯,請多指教。
template<class TIMER_IMP>
class TTimer
{
public:
    enum TimerState
    {
        RUNNING,
        STOPPED,
    };
    TIMER_IMP m_timer;
    int m_status;
    double m_CountTime;
public:
    TTimer():m_status(RUNNING){}
    /// 開始
    double Start()
    {
        m_status = RUNNING;
        m_timer.ReStart();
        return m_CountTime;
    }
    /// 停止
    double Stop()
    {
        m_CountTime += GetTime();
        m_status = STOPPED;
        return m_CountTime;
    }
    /// 重新計時
    void  Restart()
    {
        m_CountTime = 0;
        m_status = RUNNING;
        m_timer.ReStart();
    }
    /// 更新起始點為現在
    void ReTick()
    {
        m_timer.ReStart();
    }
    /// 得到以秒為單位的時間
    double GetTime()
    {
        return m_timer.GetTime();
    }
    double GetCountTime()
    {
        if (m_status == STOPPED)
            return m_CountTime;
        return m_CountTime + m_timer.GetTime();
    }
};

先定義一個只需要ReStart實作跟GetTime實作的樣版。

用標準程式庫實作timer
class stdTimer
{
public:
    // Reset the timer
    inline void ReStart()
    {
        start = std::clock();
    }
    // Save the result
    inline double GetTime()
    {
        double elapsed = (double)std::clock() - start;
        elapsed /= CLOCKS_PER_SEC;
        return elapsed;
    }
private:
    std::clock_t start;
};
其它的同樣也這樣實作,
最後做出四種timer
namespace timer
{
    typedef TTimer<stdTimer>    std;
    typedef TTimer<rdtscTimer>    rdtsc;
    typedef TTimer<winTimer>    win;
    typedef TTimer<unixTimer>    unix;
}
其中std跟rdtsc可以在unix或windows上跑,
rdtsc一定要在 pc 的環境,std則不用。

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(0) 人氣()