/* ** Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. ** ** File: periodiccondition.cpp ** ** Author: ** ** Description: ** Implementation of the training library "periodiccondition" interface. ** ** History: */ #include "pch.h" #include "PeriodicCondition.h" namespace Training { //------------------------------------------------------------------------------ // class methods //------------------------------------------------------------------------------ /* void */ PeriodicCondition::PeriodicCondition (Condition* pCondition, float fPeriod) : m_pCondition (pCondition), m_dwPeriod (static_cast (fPeriod * Time::fResolution ())) { } //------------------------------------------------------------------------------ /* void */ PeriodicCondition::~PeriodicCondition (void) { // assume no one else will be cleaning this up delete m_pCondition; } //------------------------------------------------------------------------------ bool PeriodicCondition::Start (void) { // record the start time m_dwStartTime = Time::Now ().clock (); // always evaluate the condition the first time through return m_pCondition->Start (); } //------------------------------------------------------------------------------ void PeriodicCondition::Stop (void) { m_pCondition->Stop (); } //------------------------------------------------------------------------------ bool PeriodicCondition::Evaluate (void) { // get the current clock time, and compute how much time has elapsed. DWORD dwElapsedTime = (Time::Now ().clock () - m_dwStartTime); // if the elapsed time is longer than the desired period if (dwElapsedTime > m_dwPeriod) { // advance the clock base to the beginning of the next period. This is clock accurate, as // opposed to just using the current time for the beginning of the next cycle. This method // will be better for avoiding sampling errors, even though nobody would ever notice. m_dwStartTime += m_dwPeriod; // return the result of evaluating the enclosed condition return m_pCondition->Evaluate (); } // return false to indicate the condition hasn't been evaluated because the period hasn't // elapsed yet. return false; } //------------------------------------------------------------------------------ }