00001 /* 00002 Free Download Manager Copyright (c) 2003-2007 FreeDownloadManager.ORG 00003 Open Download Manager Copyright (c) 2008-2010 OpenDownloadManager.ORG 00004 */ 00005 00006 #include "stdafx.h" 00007 #include "fsSpeedMeter.h" 00008 00009 #ifdef _DEBUG 00010 #undef THIS_FILE 00011 static char THIS_FILE[]=__FILE__; 00012 #define new DEBUG_NEW 00013 #endif 00014 00015 fsSpeedMeter::fsSpeedMeter() 00016 { 00017 m_dwSpeed = 0; 00018 m_iCurPrevSpeed = 0; 00019 m_iMaxPrevSpeed = 0; 00020 m_cMeasures = 0; 00021 m_done = 0; 00022 SetInertness (5); 00023 } 00024 00025 fsSpeedMeter::~fsSpeedMeter() 00026 { 00027 00028 } 00029 00030 void fsSpeedMeter::Done(DWORD dwDone) 00031 { 00032 UpdateSpeed (); 00033 m_done += dwDone; 00034 } 00035 00036 DWORD fsSpeedMeter::GetSpeed() 00037 { 00038 UpdateSpeed (); 00039 00040 00041 if (m_iCurPrevSpeed > 0) 00042 return m_dwSpeed; 00043 else 00044 { 00045 m_now.Now (); 00046 if (m_now - m_past == 0) 00047 return 0; 00048 00049 return (UINT) ((double) m_done / (m_now - m_past) * 1000.f); 00050 } 00051 } 00052 00053 void fsSpeedMeter::Reset() 00054 { 00055 m_past.Now (); 00056 m_done = 0; 00057 m_iCurPrevSpeed = 0; 00058 m_dwSpeed = 0; 00059 m_cMeasures = 0; 00060 } 00061 00062 void fsSpeedMeter::UpdateSpeed() 00063 { 00064 m_now.Now (); 00065 00066 00067 if (m_now - m_past > 1000) 00068 { 00069 00070 if (m_iCurPrevSpeed > m_iMaxPrevSpeed) 00071 { 00072 00073 BOOL bAllGreater = TRUE; 00074 BOOL bAllLess = TRUE; 00075 00076 for (int i = 0; i < m_iMaxPrevSpeed; i++) 00077 { 00078 if (m_aPrevSpeed [i] < m_dwSpeed) 00079 bAllGreater = FALSE; 00080 00081 if (m_aPrevSpeed [i] > m_dwSpeed) 00082 bAllLess = FALSE; 00083 } 00084 00085 00086 if (bAllGreater || bAllLess) 00087 m_cMeasures = 0; 00088 00089 m_iCurPrevSpeed = 0; 00090 } 00091 00092 m_aPrevSpeed [m_iCurPrevSpeed++] = (UINT) ((double) m_done / (m_now - m_past) * 1000.f); 00093 00094 if (m_cMeasures == 0) 00095 m_dwSpeed = m_aPrevSpeed [m_iCurPrevSpeed-1]; 00096 00097 m_cMeasures++; 00098 00099 m_dwSpeed = DWORD (m_dwSpeed * ((double)(m_cMeasures-1) / m_cMeasures) + 00100 (double) m_aPrevSpeed [m_iCurPrevSpeed-1] / m_cMeasures); 00101 00102 m_past.Now (); 00103 m_done = 0; 00104 } 00105 } 00106 00107 void fsSpeedMeter::SetInertness(int val) 00108 { 00109 if (val < 10) 00110 { 00111 m_iMaxPrevSpeed = val; 00112 m_iCurPrevSpeed = 0; 00113 m_dwSpeed = 0; 00114 } 00115 }
1.5.6