Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Написал две примитивные функции - Одна предназначена для не совсем точного подсчёта скорости закачки (по InetGet), а друга на основе этой скорости закачки высчитывает сколько времени осталось до окончания (в секундах)...
НО! я полагаю что есть более точное решение этой задумке, ведь по идее, должны учитываться не просто полученные данные в интервале одной секунды, а ещё и скорость модема, скорость отдачи на сервере и т.п... вот как бы всё это расчитать, и построить точную функцию для подсчёта скорости закачки и оставшееся время до окончания?

Вот эти две функции и пример их применения:

Код: Выделить весь код
;Заносим в переменную $URL ссылку на закачку.
$URL = "http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.2.0-setup.exe"

;Берём из ссылки только имя файла.
$FileName = StringRegExpReplace($URL, "^.*/", "")

;Ставим ссылку на закачку в фоновом режиме.
InetGet($URL, "C:\" & $FileName, 1, 1)

;Получаем общий размер файла по ссылке (в байтах).
$InetGetSize = InetGetSize($URL)

;Пока файл закачивается, проверяем размер, оставшееся время, и выводим в трее результаты.
While @InetGetActive
    $BytesCheckBefore = @InetGetBytesRead
    Sleep(1000)
    $BytesCheckAfter = @InetGetBytesRead
    $SpeedByBytes = _InetGetSpeed($BytesCheckAfter, $BytesCheckBefore)
    TrayTip("Download", "Approximately Remained Time (seconds): " & Round(_InetGetRemained(@InetGetBytesRead, $InetGetSize, $SpeedByBytes)), 0, 1)
WEnd

;Функция возвращает скорость скачивания на основе полученных данных (до, и после секунды) - возвращаются байты в секунду (b/s).
Func _InetGetSpeed($BytesCheckAfter, $BytesCheckBefore)
    $RetSpeedByBytes = $BytesCheckAfter - $BytesCheckBefore
    If $RetSpeedByBytes < 0 Then Return 0
    Return $RetSpeedByBytes
EndFunc

;Функция возвращает оставшееся время в секундах (за счёт вычесления из общего размера файла и деления на скорость скачивания).
Func _InetGetRemained($Bytes, $TotalBytesSize, $SpeedByBytes)
    $RemainedBytes = $TotalBytesSize - $Bytes
    If $RemainedBytes <= 0 Then Return 0
    Return $RemainedBytes / $SpeedByBytes
EndFunc

P.S.
Если файл около 2-ух 3-ёх MB, то функции подсчитывают довольно точно, но если речь идёт уже о 5-ти и более MB, то счётчик начинает показыать результаты в хаотичном порядке.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 06:05, 09-01-2007 | #110