Listing 2: Member function TimeRemaining


SECONDS TCountDownClock::TimeRemaining(long lBytesTransfered)
{
  MILLISECOND msCurrentTime, 
                      msTimeElapsed;
  float fBytesPerSecond, 
           fAvgBytesPerSecond, 
           fTransferRate;
  long  lBytesTransferedThisInterval;

  // Calculate and store the current interval transfer rate
  msCurrentTime = (MILLISECONDS)SystemTime();
  m_lIntervalCount++;
  msTimeElapsed = msCurrentTime - m_msLastTime;
  m_msLastTime = msCurrentTime;
  lBytesTransferedThisInterval = lBytesTransfered - m_lLastBytes;
  m_lLastBytes = lBytesTransferedThisInterval;
  fBytesPerSecond = float(lBytesTransferedThisInterval) /
                    (float(msTimeElapsed) * 1000.0);
  StoreTransferRate(fBytesPerSecond); 
  
  // convert from MILLISECOND to
  // SECOND and see if enough time
  // has elapsed to report a meaningful
  // result  
  if ((msCurrentTime - m_msStartTime) * 1000 < kInitialWait)
  {
	return -1; 
  }
    
  // Calculate the overall average
  // transfer rate
  fAvgBytesPerSecond = float(lBytesTransfered )/
		         (float(msCurrentTime - m_msStartTime) /1000.0);
  
  // calculate the weighted transfer rate
  fTransferRate = CalculateTransferRate(fAvgBytesPerSecond);
  
  // return the estimated time in SECONDs
  // for the data transfer to complete  	
  return SECONDS(float(m_lBytesToTransfer - lBytesTransfered) /
fTransferRate);
}
// ------------------------------------