Calculate how much time syncing takes, and show it at statusbar.

This commit is contained in:
cheatfate 2020-11-12 13:16:51 +02:00 committed by zah
parent 332e248d91
commit f642f71457
1 changed files with 29 additions and 1 deletions

View File

@ -116,6 +116,7 @@ type
inProgress*: bool inProgress*: bool
insSyncSpeed*: float insSyncSpeed*: float
avgSyncSpeed*: float avgSyncSpeed*: float
timeLeft*: Duration
syncCount*: uint64 syncCount*: uint64
syncStatus*: string syncStatus*: string
@ -1011,6 +1012,29 @@ proc guardTask[A, B](man: SyncManager[A, B]) {.async.} =
man.workers[index].future = future man.workers[index].future = future
pending[index] = future pending[index] = future
proc toTimeLeftString(d: Duration): string =
var v = d
var res = ""
let ndays = chronos.days(v)
if ndays > 0:
res = res & (if ndays < 10: "0" & $ndays else: $ndays) & "d"
v = v - chronos.days(ndays)
let nhours = chronos.hours(v)
if nhours > 0:
res = res & (if nhours < 10: "0" & $nhours else: $nhours) & "h"
v = v - chronos.hours(nhours)
else:
res = res & "00h"
let nmins = chronos.minutes(v)
if nmins > 0:
res = res & (if nmins < 10: "0" & $nmins else: $nmins) & "m"
v = v - chronos.minutes(nmins)
else:
res = res & "00m"
res
proc syncLoop[A, B](man: SyncManager[A, B]) {.async.} = proc syncLoop[A, B](man: SyncManager[A, B]) {.async.} =
mixin getKey, getScore mixin getKey, getScore
var pauseTime = 0 var pauseTime = 0
@ -1082,6 +1106,9 @@ proc syncLoop[A, B](man: SyncManager[A, B]) {.async.} =
man.insSyncSpeed = bps man.insSyncSpeed = bps
man.avgSyncSpeed = man.avgSyncSpeed + man.avgSyncSpeed = man.avgSyncSpeed +
(bps - man.avgSyncSpeed) / float(man.syncCount) (bps - man.avgSyncSpeed) / float(man.syncCount)
let nsec = (float(wallSlot - headSlot) / man.avgSyncSpeed) *
1_000_000_000.0
man.timeLeft = chronos.nanoseconds(int64(nsec))
asyncSpawn watchTask() asyncSpawn watchTask()
asyncSpawn averageSpeedTask() asyncSpawn averageSpeedTask()
@ -1104,7 +1131,8 @@ proc syncLoop[A, B](man: SyncManager[A, B]) {.async.} =
# Update status string # Update status string
man.syncStatus = map & ":" & $pending & ":" & man.syncStatus = map & ":" & $pending & ":" &
man.insSyncSpeed.formatBiggestFloat(ffDecimal, 4) & ":" & man.insSyncSpeed.formatBiggestFloat(ffDecimal, 4) & ":" &
man.avgSyncSpeed.formatBiggestFloat(ffDecimal, 4) & man.avgSyncSpeed.formatBiggestFloat(ffDecimal, 4) & ":" &
man.timeLeft.toTimeLeftString() &
" (" & $man.queue.outSlot & ")" " (" & $man.queue.outSlot & ")"
if headAge <= man.maxHeadAge: if headAge <= man.maxHeadAge: