Creat0R
Цитата:
А что если объявлять локально переменные которые не изменяются нигде, это повлияет на результаты?
|
не повлияет, только значение
$InetBytesBack придется вбивать дважды - при определении массива и в функции, а
$InetSpeed в твоем случае и вовсе не нужна - можно просто заменить "
$InetSpeed = <формула>" на "
Return <формула>"
Цитата:
Ну не очень мне нравится идея с Adlib в этом случае
|
Свои предпочтения нужно обосновывать.
AdLib хорош тем, что он не зависит от скрипта (есть соединение или нет) и временной интервал всегда одинаков. В твоем варианте интервал между "временнЫми засечками" на самом деле >100 ровно на столько, сколько потребуется скрипту на выполнение команд после
Sleep(100). Обычно это неcущественно, но в общем случае он может быть любым (особенно если где-нибудь есть еще один
Sleep() 
), соответственно показания скорости будут неверными. Для сохранения точности придется в дополнение к
@InetGetBytesRead сохранять показания
TimerInit(), хотя интервал замера уже перестанет быть фиксированным... Кроме того инициализацию массива придется возложить на основной скрипт, так как функция не знает старая это закачка или новая.
Код:

Global $InetBytesRead
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
_GetProgressSpeed ($InetBytesRead, @InetGetBytesRead, 100)
While @InetGetActive
Sleep(100)
$bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1024)
$speed = StringFormat('Speed: %d Kb/Sec',_GetProgressSpeed ($InetBytesRead, @InetGetBytesRead) *0.9765625)
TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend
Func _GetProgressSpeed (ByRef $arrValueBack, $intValue = -1, $intCountBack = 0)
Local $nb, $nt, $bound = UBound($arrValueBack,1)
If $intCountBack<=0 Then $intCountBack = $bound-1 ; Восстанавливаем актуальное значение глубины отката
; Блок инициализации массива и контроля ошибок
If $intCountBack<=0 Then Return SetError(1, 0, -1) ; Ошибка размерности 1
If $intValue<0 Then
Dim $arrValueBack [$intCountBack+1][2] = [[1,TimerInit()]]
Return 0
ElseIf $intCountBack<>$bound-1 Then
Dim $arrValueBack [$intCountBack+1][2] = [[1,TimerInit()],[$intValue,TimerInit()]]
Return 0
Else
If UBound($arrValueBack,2)<2 Then Return SetError(2, 0, -1) ; Ошибка размерности 2
If ($arrValueBack[0][0]<=0) Or ($arrValueBack[0][0]>$intCountBack) Then Return SetError(3, 0, -1) ; Ошибка целостности
EndIf
; Ищем следующую ячейку массива
$arrValueBack[0][0]+=1
If $arrValueBack[0][0] > $intCountBack Then $arrValueBack[0][0]=1
; Сохраняем значения массива в переменных (цикл назад)
$nb = $arrValueBack[$arrValueBack[0][0]][0]
$tb = $arrValueBack[$arrValueBack[0][0]][1]
; Записываем новые значения загруженных байт и время
$arrValueBack[$arrValueBack[0][0]][0] = $intValue
$arrValueBack[$arrValueBack[0][0]][1] = TimerInit()
; Выбираем формулу в зависимости от того проходим первый цикл или нет
If $nb =0 Then Return $arrValueBack[$arrValueBack[0][0]][0] / TimerDiff($arrValueBack[0][1])
Return ($arrValueBack[$arrValueBack[0][0]][0]-$nb) / TimerDiff($tb)
EndFunc
Цитата:
Разве не на 1024 нужно делить?
|
с учетом вышеизложенного это мелочи
...кстати, множитель
0.9765625 как раз отвечает за перевод исходной величины
Byte/ms в
KByte/sec