瀏覽代碼

Bug 2073: When logging transfer statistics, recent transfer speed was logged instead of average speed of whole transfer

https://winscp.net/tracker/2073
(cherry picked from commit 7ce9723d4150d6c0e7cb84ce4631c2d293897c33)

Source commit: fb49d89561276dfe5e89a8e0c1b452e1702784c8
Martin Prikryl 3 年之前
父節點
當前提交
04dd47813c
共有 1 個文件被更改,包括 30 次插入11 次删除
  1. 30 11
      source/core/FileOperationProgress.cpp

+ 30 - 11
source/core/FileOperationProgress.cpp

@@ -846,6 +846,20 @@ unsigned int __fastcall TFileOperationProgressType::CPS()
   return GetCPS();
 }
 //---------------------------------------------------------------------------
+inline static unsigned int CalculateCPS(__int64 Transferred, unsigned int MSecElapsed)
+{
+  unsigned int Result;
+  if (MSecElapsed == 0)
+  {
+    Result = 0;
+  }
+  else
+  {
+    Result = (unsigned int)(Transferred * MSecsPerSec / MSecElapsed);
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
 // Has to be called from a guarded method
 unsigned int __fastcall TFileOperationProgressType::GetCPS()
 {
@@ -868,15 +882,8 @@ unsigned int __fastcall TFileOperationProgressType::GetCPS()
       TimeSpan = (Ticks - FPersistence.Ticks.front());
     }
 
-    if (TimeSpan == 0)
-    {
-      Result = 0;
-    }
-    else
-    {
-      __int64 Transferred = (FPersistence.TotalTransferred - FPersistence.TotalTransferredThen.front());
-      Result = (unsigned int)(Transferred * MSecsPerSec / TimeSpan);
-    }
+    __int64 Transferred = (FPersistence.TotalTransferred - FPersistence.TotalTransferredThen.front());
+    Result = CalculateCPS(Transferred, TimeSpan);
   }
   return Result;
 }
@@ -956,7 +963,7 @@ void __fastcall TFileOperationProgressType::UnlockUserSelections()
 UnicodeString __fastcall TFileOperationProgressType::GetLogStr(bool Done)
 {
   UnicodeString Transferred = FormatSize(TotalTransferred);
-  UnicodeString Left;
+
   TDateTime Time;
   UnicodeString TimeLabel;
   if (!Done && TotalSizeSet)
@@ -970,7 +977,19 @@ UnicodeString __fastcall TFileOperationProgressType::GetLogStr(bool Done)
     TimeLabel = L"Elapsed";
   }
   UnicodeString TimeStr = FormatDateTimeSpan(Configuration->TimeFormat, Time);
-  UnicodeString CPSStr = FormatSize(CPS());
+
+  unsigned int ACPS;
+  if (!Done)
+  {
+    ACPS = CPS();
+  }
+  else
+  {
+    unsigned int Elapsed = TimeToMSec(TimeElapsed());
+    ACPS = CalculateCPS(TotalTransferred, Elapsed);
+  }
+  UnicodeString CPSStr = FormatSize(ACPS);
+
   return FORMAT(L"Transferred: %s, %s: %s, CPS: %s/s", (Transferred, TimeLabel, TimeStr, CPSStr));
 }
 //---------------------------------------------------------------------------