Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Внимание!
Тема переведена в архивное состояние
Текущая тема http://forum.oszone.net/thread-98914.html
[hr]Архивы старых тем по AutoIt (http://forum.oszone.net/forumdisplay.php?f=61&filter_string=%C0%F0%F5%E8%E2+-+%F7&filter_by=title) или они же в 7z архиве (версии для печати) - 846 кб (http://tools.oszone.net/Vadikan/forum_archives/autoit_threads_archive.7z)
(настоятельно рекомендуется к прочтению/поиску)
Руководство к действию по работе c AutoIt.
http://www.autoitscript.com/images/autoit_6_240x100.jpg
Сайт программы (http://www.hiddensoft.com/autoit3/)
Русская справка (http://www.autoitscript.com/autoit3/docs.php)
Коллекция AutoIt скриптов (http://sanjaalone.h15.ru/) от Sanja Alone (http://forum.oszone.net/member.php?userid=28800)
Коллекция AutoIt скриптов (http://www.msfn.org/board/index.php?showtopic=20197) от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (http://www.dx21.com/scripting/rundll32/refguide.asp) (команды запуска диалоговых окон и не только...)
AutoIt скрипты - введение и FAQ (http://oszone.net/display.php?id=3663) (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).
[hr]Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений" (http://forum.oszone.net/announcement.php?f=61&announcementid=43). Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров (http://forum.oszone.net/announcement.php?f=32&announcementid=24).[hr]В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki (http://wiki.oszone.net) по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit (http://wiki.oszone.net/index.php/Категория:AutoIt). Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.
Возможно где-то подобный вопрос уже и был, к сожалению я ответа на него не нашел.
Как мне через AutoIT сэмитировать двойной клик на определенной иконке на рабочем столе? Сам ярлык может быть в произвольном месте, но он есть точно...
Извиняюсь если это на самом деле глупый вопрос, сам сижу уже второй день, не могу найти...
eNcub
Этот пример, произведёт двойной клик в левой верхней части экрана:
MouseClick("left",0,0,2,50)
Первый параметр определяет кнопку мыши
Второй и третий - координаты экрана X,Y
Четвёртый параметр - это количество кликов мышью
Ну и наконец последний - это скорость перемещения указателя к заданным координатам экрана.
Этот способ подходит, если значок ярлыка находиться всё время на одном месте.
В остальных случаях логично использовать команду Run() - для запуска файла к которому ведёт ярлык.
Diamond этот способ я знаю, весь хэлп перерыл...
Помоги тогда как обратиться к определнному VPN подключению. Та же ситуация, открыть панель управления могу, а два раза кликнуть на нужном соединении не могу...
eNcub, пользуйся штатной утилитой rasdial:
rasdial Имя_VPN_подключения имя_пользователя пароль_пользователя
параметры с пробелами заключаются в кавычки
при удачном подключении возвращает 0, в противном случае код конкретной ошибки
есть вариант запускать как через ярлык:
rasphone.exe -f "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" -d "Имя VPN подключения"
при этом не надо указывать имя и пароль, но для полного автомата в свойствах подключения необходимо снять все галки "запрашивать имя\пароль\номер"
есть вариант запускать как через ярлык:
Код:
rasphone.exe -f "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" -d "Имя VPN подключения"
при этом не надо указывать имя и пароль, но для полного автомата в свойствах подключения необходимо снять все галки "запрашивать имя\пароль\номер"
Вот это мне и нужно было :).
Только... вот теперь вопрос дурацкий будет, а как эту строку прописать правильно в АвтоИТ?
Пробую из командной строки - всё получается, а в скрипте не могу. В пути к ярлыку есть пробелы, как сделать чтобы воспринимался параметр командной строки как единое целое?
Пробовал
rasphone.exe -f 'C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk' - не работает. Есть ли в АвтоIT что-то типа экранирования символов (типа обратного слэша в линуксе).?
eNcub, просто удвой знаки кавычек:
$ConnectionName="Имя подключения"
Run(@SystemDir&"\rasphone.exe -f """&@AppDataCommonDir&"\Microsoft\Network\Connections\Pbk\rasphone.pbk"" -d """&$ConnectionName&"""")
Никак не могу довести до ума одну, казалось бы простую вещь...
Имеем переменную $InetSpeed которой присваивается определённое значение каждую секунду, как можно догадаться, эта переменная содержит данные о скорости закачки файла.
Вот по завершению закачки, мне нужно узнать среднюю скорость за этот промежуток закачки.
Я сделал, наверное (хотя точно) не правильно, но вот что у меня получилось...
Я засёк самую большую видимую скорость, самую маленькую, и вычеслил золотую середину среди них:
$LowsetSpeed = 0
$HighestSpeed = 0
$TempLowsetSpeed = 0
$TempHighestSpeed = 0
While @InetGetActive
$InetGetBytesRead = @InetGetBytesRead
;Получаем скорость закачки (кб' в секунду)
$InetSpeed = 170;Тут идёт функция _InetGetSpeed(1000) - подсчитывает скорость закачки в секунду. Возвращается скорость/в сек.
$TempLowsetSpeed = $InetSpeed
$TempHighestSpeed = $InetSpeed
If $TempLowsetSpeed < $LowsetSpeed Or $LowsetSpeed = 0 Then $LowsetSpeed = $TempLowsetSpeed
If $TempHighestSpeed > $HighestSpeed Or $HighestSpeed = 0 Then $HighestSpeed = $TempHighestSpeed
WEnd
$AverageDownloadSpeed = Round(_GetAverageSpeed($LowsetSpeed, $HighestSpeed)/1024)
Func _GetAverageSpeed($LowsetSpeed, $HighestSpeed)
Return ($LowsetSpeed / 2) + ($HighestSpeed / 2)
EndFunc
В общем в результате, если самая большая скорость была 190, а самая маленькая 65, то просто 190 делим на 2, 65 тоже делим на 2, и прибавляем результаты (получаем 127,5)...
Но я не уверен что это правильное решение, полагаю нужно в процессе (в цикле) засикать наиболее замеченные данные о скорости, и уже между ними подсчитывать среднее значение - но как это реализовать корректно, я не могу никак сообразить :idontnow:
Кто может, имеет время, помогите плиз разобраться :shuffle:
Creat0R
Большое спасибо за помощь
Действительно твой совет об использовании новых окон GUI для вывода информации значительно облегчает жизнь.
Есть пара вопросов :
1.Никак не могу найти функцию переименования файлов (ведь должен же быть какой-нибудь Rename)
2.Как задействовать поиск в Helpe (почему то не находятся разделы) ?
Creat0R
не совсем понятно как работает _InetGetSpeed(), но тем не менее... среднюю скорость нельзя вычислить на основывании только мгновенных значений скорости. Для расчета нужно просто взять разницу в значениях @InetGetBytesRead (закачанный размер) и разделить на соответствующую разницу значений TimerDiff() (за какой период времени).
кстати, как оно по русски?в данном случае просто "подстрока" :)
gregaz
Никак не могу найти функцию переименования файлов
FileMove("C:\file.txt", "C:\file_1.txt")
также и с папками...
Но учти, в версии 3.2.2.0 и ранее, есть баг - если пытаться переименовать файл в то же имя но с разным регистром, файл удаляется, к примеру вот так:
FileMove("C:\test.txt", "C:\teST.txt", 1)
Файл C:\test.txt будет удалён.
Я дал знать разработчикам об этом баге, и в версиях выше чем 3.2.2.0 они вроде это поправили.
.Как задействовать поиск в Help
Речь про обычный файл справки к AutoIt? там есть вкладка Поиск, в неё вводишь слово-запрос, и нажимаешь Enter, если есть соответствующие разделы, они будут отображены ;).
amel27
не совсем понятно как работает _InetGetSpeed()
Вот она:
Func _InetGetSpeed($Sleep=1000)
Local $BytesCheckBefore = @InetGetBytesRead
Sleep($Sleep)
Local $BytesCheckAfter = @InetGetBytesRead
Local $RetSpeedByBytes = $BytesCheckAfter - $BytesCheckBefore
If $RetSpeedByBytes < 0 Then $RetSpeedByBytes = 0
Return $RetSpeedByBytes
EndFunc
Для расчета нужно просто взять разницу в значениях @InetGetBytesRead (закачанный размер) и разделить на соответствующую разницу значений TimerDiff()
А можно пример плиз, а то я не уверен что понял как засекать и сравнивать :shuffle: .
Creat0Rможно пример If Not(InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "xpSP2_ru.exe", 1, 1)) Then MsgBox (16,'','')
$begin = TimerInit()
While @InetGetActive
Sleep(250)
$AverageSpeed = (@InetGetBytesRead / TimerDiff($begin))
TrayTip("Downloading", "Average Speed = " & Int($AverageSpeed) & " Kbyte/sec", 10, 16)
Wend
Вот онаИмхо текущую скорость удобней измерять через AdLib():Global $InetSpeed = 0, $InetGetBytesRead = 0, $InetTimeStamp = 0
AdlibEnable ("_InetGetSpeed", 1000)
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
While @InetGetActive
Sleep(250)
TrayTip("Downloading", "Speed = " & Int($InetSpeed) & " Kbyte/sec", 10, 16)
Wend
Func _InetGetSpeed()
If @InetGetActive Then
If @InetGetBytesRead <> -1 Then
Local $ticks = TimerDiff($InetTimeStamp)
If $ticks>0 Then $InetSpeed = (@InetGetBytesRead-$InetGetBytesRead) / $ticks
EndIf
$InetGetBytesRead = @InetGetBytesRead
$InetTimeStamp = TimerInit()
Else
$InetGetBytesRead = 0
$InetSpeed = 0
EndIf
EndFunc
amel27
текущую скорость удобней измерять через AdLib():
Не всегда, а что если в скрипте уже используется Adlib для других целей?
Хотя это можно совмещать... но почему бы не поместить функцию в цикл, и передавать ей как параметр чтение байтов, и возвращать с неё данные о скорости? это мне кажется лучший вариант...
Global $InetSpeed = 0, $InetGetBytesRead = 0, $InetTimeStamp = 0, $begin = TimerInit()
InetGet("http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.4.4-setup.exe", "test.exe", 1, 1)
While @InetGetActive
Sleep(200)
$Bytes = @InetGetBytesRead
$InetSpeed = _InetGetSpeed($Bytes)
$AverageSpeed = $Bytes*1000 / TimerDiff($begin)
TrayTip("Downloading", "Speed = " & Round($InetSpeed/1024, 1), 10, 16)
Wend
MsgBox(0, "", "Avarage speed is: " & Round($AverageSpeed/1024, 1))
Func _InetGetSpeed($Bytes)
If @InetGetActive Then
If $InetTimeStamp Then
Local $Ticks = TimerDiff($InetTimeStamp)
If $Ticks > 0 Then $InetSpeed = ($Bytes-$InetGetBytesRead)*1000 / $Ticks
EndIf
$InetGetBytesRead = $Bytes
$InetTimeStamp = TimerInit()
Else
$InetTimeStamp = 0
$InetGetBytesRead = 0
$InetSpeed = 0
EndIf
Return $InetSpeed
EndFunc
Остаётся один главный вопрос - Насколько это точный подсчёт? и можно ли “доверять” этим данным?
Спасибо за примеры, вроде всё работает как надо :).
P.S
А среднюю скорость мне нужно не в цикле отображать, а подсчитать её для конечного вывода (чтобы показать юзеру с какой скоростью (средней) закаивался файл за весь промежуток закачки).
Diamond
По теме словарей (Dictionary):
http://www.autoitscript.com/forum/index.php?showtopic=47048&st=0&p=352256&#entry352256
Creat0Rпочему бы не поместить функцию в цикл, и передавать ей как параметр чтение байтов, и возвращать с неё данные о скорости?Из соображений эффективности... Смущает Sleep() внутри функции - обычно время контролирует один (основной цикл) и не предполагается, что какая-то функция будет стопорить скрипт...
З.Ы. скрипт привел к работоспособному виду.
amel27
скрипт привел к работоспособному виду.
А что если в Adlib я поставлю не 1000, а 500, чтобы данные обновлялись более часто? если это нарушает достоверность данных, то как сделать отображение чаще чем раз в секунду, но при этом сохранить достоверность (надёжность) данных о скорости?
P.S
А по поводу средней скорости.... на выходе из цикла переменная $AverageSpeed будет содержать общую среднюю скорость закачки на промежуток времени всей закачки, или она будет содержать последнюю засеченную среднюю скорость (на выходе из цикла)?
Creat0Rа что если в скрипте уже используется Adlib для других целей?использовать самопальный AdLib ;) тем более, что у него нет ограничений на количество запусков...
на выходе из цикла переменная $AverageSpeed будет содержать общую среднюю скорость закачки на промежуток времени всей закачки, или она будет содержать последнюю засеченную среднюю скорость (на выходе из цикла)?среднюю по закаченной части файла, соответственно на выходе - по всему файлу... вообще если нужен только итог, то достаточно по завершению разделить FileGetSize() на TimerDiff().
А что если в Adlib я поставлю не 1000, а 500, чтобы данные обновлялись более часто? если это нарушает достоверность данных, то как сделать отображение чаще чем раз в секунду, но при этом сохранить достоверность (надёжность) данных о скорости?придется хранить все предыдущие значения @InetGetBytesRead, например в массиве... Вот измененный вариант, где скорость измеряется за последние 500*10 = 5 сек закачки:Global $AdLibMS=500, $InetBytesBack = 10
Global $InetSpeed = 0, $InetTimeStamp
Global $InetBytesRead[$InetBytesBack+1]
AdlibEnable ("_InetGetSpeed", $AdLibMS)
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
While @InetGetActive
Sleep(100)
$bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1000)
$speed = StringFormat('Speed: %d Kb/Sec',$InetSpeed)
TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend
Func _InetGetSpeed()
Local $nb ; Значение массива по текущему индексу до его обновления (цикл назад)
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
EndFunc
schel4ok
13-06-2007, 14:34
Написал скрипты установки MathCAD 2001 и AutoCAD 2006 Mechanical.
В MathCAD 2001 после установки при первом запуске программы производится какая-то настройка. При этом необходимо не вынимать установочный диск. Грубо говоря, тыкаешь ярлык к mathcad.exe и запускается прогресс бар msi-настройщика длящийся около минуты. У ярлыка не указаны никакие ключи командной строки (точнее поле объект в свойствах ярлыка вообще неактивно и недоступно для просмотра).
Поэтому простой запуск
Run (@Programfilesdir & 'Mathsoft\Mathcad 2001 professional\mathcad.exe')
Processwait('процесс')
ProcessWaitClose('процесс')
ProcessClose ('mathcad.exe')
не помогает! При этом первой строчкой запускается сам Маткад и никакой настройки не производится. Настройка происходит только при запуске через ярлык. Как узнать что именно при этом происходит?
В AutoCAD 2006 Mechanical после установки при первом запуске запускается процесс регистрации. Только строчка Run (@Programfilesdir & '...\...\Acad.exe') тоже не помогает. При отработке этой строчки из скрипта, выскакивает диалоговое окно сообщающее о том, что система не может найти како-то .dll. Если же сразу после этого запустить AutoCAD вручную - то все нормально!
Помогите!
Внедрённый HTML объект
Анимированный gif, звук (в бесконечном цикле!), плюс эффект с текстом.
З.Ы. Пытался с помощью дополнительных стилей убрать рамку у объекта , но нашёл лишь несколько новых рамок... и всё же есть одна небольшая хитрость:
В коде есть четыре закомментированных параметра, если их задействовать - то рамка исчезнет.$sound=@ScriptDir & "\MUSIC9.MID"
$image=@ScriptDir & "\butterfly.gif"
Opt("GUIOnEventMode",1)
#include <GUIConstants.au3>
$hGUI=GUICreate("Embedded Web control Test", 442, 300)
GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$oIE = ObjCreate("Shell.Explorer.2")
$GUIActiveX = GUICtrlCreateObj($oIE, 1, 1, 440, 62)
$oIE.navigate ("about:blank")
While $oIE.busy
Sleep(200)
WEnd
$oIE.document.write('<bgsound loop="-1" src="' & $sound & '">')
$oIE.document.write('<marquee behavior="alternate" direction="right"><font size="+3" color="#ff00ff"><b>Web control Test</b></font></marquee>')
$oIE.refresh
;~ $oIE.height=66
;~ $oIE.width=444
;~ $oIE.left=-4
;~ $oIE.top=-4
$oIE.document.body.scroll = "no"
$oIE.document.body.bgcolor = "buttonface"
$oIE.document.body.leftmargin = "2"
$oIE.document.body.rightmargin = "2"
$oIE.document.body.topmargin= "10"
$oIE.document.body.background = $image
GUICtrlSetStyle($GUIActiveX,-1,0x1999)
GUICtrlSetState($GUIActiveX,$GUI_DISABLE)
GUISetState(@SW_SHOW)
While 1
Sleep(1000)
WEnd
Func Quit()
Exit
EndFuncCreat0R
По теме словарей (Dictionary)Эх, мне бы этот пример немного пораньше... и я сэкономил бы пару часов на его изучении. :search:
В любом случае, большое спасибо! :)
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 в этом случае :shuffle:
Кстати, у тебя в примере чтобы получить кб, байты деляться на 1000:
@InetGetBytesRead/1000
Разве не на 1024 нужно делить?
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.