amel27
Цитата:
вообще если нужен только итог, то достаточно по завершению разделить FileGetSize() на TimerDiff()
|
Гинеально!!! оказалось намного проще! спасибо.
Цитата:
придется хранить все предыдущие значения @InetGetBytesRead, например в массиве
|
А что если объявлять локально переменные которые не изменяются нигде, это повлияет на результаты?
Вот как я сделал:
Код:
Global $InetBytesRead[10+1]
InetGet("http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.4.4-setup.exe", "test.exe", 1, 1)
$begin = TimerInit()
While @InetGetActive
Sleep(100)
$InetSpeed = _InetGetSpeed(100)
$bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1024)
$speed = StringFormat('Speed: %d Kb/Sec',$InetSpeed)
TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend
MsgBox (64,'', "Download is finished with Avarage Speed of: " & Int(FileGetSize("test.exe")/TimerDiff($begin)) & " kb/s")
Func _InetGetSpeed($AdLibMS=500)
Local $nb ; Значение массива по текущему индексу до его обновления (цикл назад)
Local $InetSpeed = 0, $InetBytesBack = 10
If @InetGetActive Then
; Если первый раз, то инициализируем массив
If $InetBytesRead[0]=0 Then $InetBytesRead[0] = 1
; Ищем следущую ячейку массива
$InetBytesRead[0]+=1
If $InetBytesRead[0] > $InetBytesBack Then $InetBytesRead[0]=1
; Сохраняем значение массива в переменной (сколько было байт 1 цикл назад)
$nb = $InetBytesRead[$InetBytesRead[0]]
; Записываем новое значение загруженных байт
$InetBytesRead[$InetBytesRead[0]] = @InetGetBytesRead
; Выбираем формулу в зависимости от того проходим первый цикл или уже нет
If $nb >0 Then
$InetSpeed = ($InetBytesRead[$InetBytesRead[0]]-$nb)/($AdLibMS * $InetBytesBack)
Else
$InetSpeed = $InetBytesRead[$InetBytesRead[0]]/($AdLibMS * $InetBytesRead[0])
EndIf
Else
; Если нет закачки затираем массив и сбрасываем параметры
If $InetBytesRead[0]>0 Then Global $InetBytesRead[$InetBytesBack+1]
$InetSpeed = 0
EndIf
Return $InetSpeed
EndFunc
Ну не очень мне нравится идея с Adlib в этом случае
Кстати, у тебя в примере чтобы получить кб, байты деляться на 1000:
Код:
@InetGetBytesRead/1000
Разве не на 1024 нужно делить?