RateMeasure.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:2k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // RateMeasure.cpp: implementation of the CRateMeasure class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "RateMeasure.h"
  7. #include "StorageWrapper.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CRateMeasure::CRateMeasure(BLONG lAmountLeft, CStorageWrapper* pStorageWrapper)
  17. {
  18. m_lStart = -1;
  19. m_lLast = -1;
  20. m_fRate = 0;
  21. m_lRemaining = -1;
  22. m_lLeft = lAmountLeft;
  23. m_bBroke = false;
  24. m_bGotAnything = false;
  25. m_pStorageWrapper = pStorageWrapper;
  26. }
  27. CRateMeasure::~CRateMeasure()
  28. {
  29. }
  30. void CRateMeasure::data_came_in(long lAmount)
  31. {
  32. if (!m_bGotAnything)
  33. {
  34. m_bGotAnything = true;
  35. time(&m_lLast);
  36. m_lStart = m_lLast - 2;
  37. m_lLeft -= lAmount;
  38. assert(m_lLeft >= 0);
  39. return;
  40. }
  41. long ltime;
  42. time(&ltime);
  43. update(ltime, lAmount);
  44. }
  45. void CRateMeasure::data_rejected(long lAmount)
  46. {
  47. m_lLeft += lAmount;
  48. }
  49. long CRateMeasure::get_time_left()
  50. {
  51. if (!m_bGotAnything)
  52. return -1;
  53. long ltime;
  54. time(&ltime);
  55. if (ltime < m_lLast)
  56. m_lLast = ltime;
  57. if ((ltime - m_lLast) > 15)
  58. update(ltime, 0);
  59. return m_lRemaining;
  60. }
  61. BLONG CRateMeasure::get_size_left()
  62. {
  63. assert(false);
  64. return m_lLeft;
  65. }
  66. void CRateMeasure::update(long ltime, long lAmount)
  67. {
  68. //
  69. // unknown the real income when files unneeded are changed. so temply get the left value approximately.
  70. //
  71. m_lLeft -= lAmount;
  72. m_lLeft = m_pStorageWrapper->get_amount_left_part_include_temp();
  73. assert(m_lLeft >= 0);
  74. if (ltime == m_lStart)
  75. return;
  76. m_fRate = (m_fRate * (m_lLast - m_lStart) + lAmount) / (ltime - m_lStart);
  77. assert(m_fRate >= 0);
  78. m_lLast = ltime;
  79. if (m_fRate == 0)
  80. m_lRemaining = -1;
  81. else
  82. {
  83. m_lRemaining = m_lLeft/m_fRate;
  84. if (m_lRemaining < 0)
  85. {
  86. m_lRemaining = -1;
  87. assert(false);
  88. }
  89. }
  90. if (m_bBroke && ((m_lLast - m_lStart) < 20))
  91. m_lStart = m_lLast - 20;
  92. if ( (m_lLast - m_lStart) > 20)
  93. m_bBroke = true;
  94. }
  95. void RateMeasureTest()
  96. {
  97. /*
  98. long s = 0;
  99. long t = 0;
  100. CRateMeasure r(1000);
  101. for (int i=0; i<10; i++)
  102. {
  103. r.data_came_in(100);
  104. s = r.get_size_left();
  105. t = r.get_time_left();
  106. Sleep(100);
  107. }
  108. //*/
  109. }