API Basic WaitUntil - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Wait Until / Timeout
ClassicUO • Basic
Wait Until повторяет проверку условия до успеха либо истечения времени. Это расширение Basic, а не оператор VB.NET. Ожидание выполняется в текущем скрипте и не создаёт поток или другую процедуру.
Точный синтаксис
Wait Until condition Timeout milliseconds
Параметры
condition— condition — выражение, проверяемое сразу и затем между короткими ожиданиями. Используйте Boolean или сравнение: числовой 0 означает false, остальные значения подчиняются правилам If. Строка "false" не равна Boolean false. Можно вызывать UO-команды и свои функции; их ошибки передаются обработчику. Побочные действия функции повторяются при каждой проверке.Timeout milliseconds— Timeout обязателен. milliseconds вычисляется один раз до первой проверки условия. Нужен Integer от 0 до 2147483647; отрицательное число, дробь или String вызывают ошибку до выполнения condition. Ноль разрешает только немедленную проверку. Вне этого места timeout может оставаться обычным именем переменной.
Возвращает
Сам оператор ничего не возвращает. При успехе выполняется следующая строка. При истечении времени возникает ошибка с файлом и строкой; её принимает Try/Catch либо настроенный On Error, иначе текущий запуск завершается ошибкой. Автоматического возврата false нет. В примере 2 своя функция явно возвращает True/1 или False/0.
Поведение
- Движок сохраняет длительность и запускает монотонный Stopwatch. Условие проверяется сразу: успешная первая проверка завершает ожидание даже при нулевом лимите. При false запускается цикл. В нём проверяются отмена и пауза, вычисляется остаток времени и выполняется ожидание не более 10 мс перед следующей проверкой. Постоянного занятого цикла нет; планировщик Windows может увеличить интервал.
- На паузе проверки условия прекращаются, но прошедшее реальное время входит в лимит. После продолжения истёкший таймаут обрабатывается до следующей проверки. Стоп прерывает ожидание и, как другая аварийная отмена, пропускает скриптовые Catch/Finally. Принудительно прервать заблокировавшуюся функцию самого условия этот оператор не может: делайте такие функции короткими. Уже начавшаяся проверка заканчивается до обработки её результата или ошибки.
- Ошибка condition сохраняется, а не заменяется таймаутом. Обычная обработка ошибки или таймаута выполняет соответствующие Finally. Переменные принадлежат текущему вызову; повторный вход начинает новый отсчёт. End Wait и дополнительного параметра частоты нет. Wait(milliseconds) остаётся отдельной обычной функцией задержки.
Примеры
1. Проверять функцию с ограничением времени
# checks начинается с 0. Ready получает её ByRef и увеличивает при каждой проверке; required=3 передаётся ByVal. budget=5000 разрешает до пяти секунд. Проверки 1 и 2 возвращают false, третья — true. Main возвращает Integer 3. Это определённый пример опроса, а не имитация соединения с сервером; вместо его условия подставьте нужную проверку состояния.
Option Explicit On
Function Ready(ByRef checks As Integer, ByVal required As Integer) As Boolean
checks += 1
Return checks >= required
End Function
Sub Main()
Dim checks As Integer = 0
Const budget = 5000
Wait Until Ready(checks, 3) Timeout budget
Return checks
End Sub
Разбор параметров и выполнения:
checks начинается с 0. Ready получает её ByRef и увеличивает при каждой проверке; required=3 передаётся ByVal. budget=5000 разрешает до пяти секунд. Проверки 1 и 2 возвращают false, третья — true. Main возвращает Integer 3. Это определённый пример опроса, а не имитация соединения с сервером; вместо его условия подставьте нужную проверку состояния.
2. Вернуть Boolean из своей функции
# TryWait получает ready=False и budget=0. Единственная немедленная проверка неуспешна, возникает таймаут. Catch problem преобразует ошибку в Return False; Main возвращает 0, который можно сравнить с False. При ready=True возврат был бы 1/True. Обёртка ловит все ошибки выполнения, не только таймаут: проверяйте problem, если их нужно различать. ready здесь — переданное значение Boolean, а не функция обратного вызова.
Option Explicit On
Function TryWait(ByVal ready As Boolean, ByVal budget As Integer) As Boolean
Try
Wait Until ready Timeout budget
Return True
Catch problem
Return False
End Try
End Function
Sub Main()
Dim success = TryWait(False, 0)
Return success
End Sub
Разбор параметров и выполнения:
TryWait получает ready=False и budget=0. Единственная немедленная проверка неуспешна, возникает таймаут. Catch problem преобразует ошибку в Return False; Main возвращает 0, который можно сравнить с False. При ready=True возврат был бы 1/True. Обёртка ловит все ошибки выполнения, не только таймаут: проверяйте problem, если их нужно различать. ready здесь — переданное значение Boolean, а не функция обратного вызова.
3. Сохранить ошибку условия и выполнить завершение
# CheckStatus получает state=-1 и при первой проверке выбрасывает "disconnected". Лимит 3000 мс не подменяет эту ошибку. Catch копирует problem в message, Finally устанавливает finished=True/1. Main возвращает "disconnected:1". state=1 сразу выполнил бы условие, state=0 оставался бы false до таймаута. Пример собственной проверки состояния работает без подключения к игре.
Option Explicit On
Function CheckStatus(ByVal state As Integer) As Boolean
If state < 0 Then
Throw "disconnected"
End If
Return state = 1
End Function
Sub Main()
Dim message = ""
Dim finished = False
Try
Wait Until CheckStatus(-1) Timeout 3000
Catch problem
message = problem
Finally
finished = True
End Try
Return message & ":" & CStr(finished)
End Sub
Разбор параметров и выполнения:
CheckStatus получает state=-1 и при первой проверке выбрасывает "disconnected". Лимит 3000 мс не подменяет эту ошибку. Catch копирует problem в message, Finally устанавливает finished=True/1. Main возвращает "disconnected:1". state=1 сразу выполнил бы условие, state=0 оставался бы false до таймаута. Пример собственной проверки состояния работает без подключения к игре.