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);
}
// ------------------------------------