Таймеры и команды запуска скриптов

Бывают случаи, когда выполняемый код требует задержки перед переходом к следующему шагу (строке кода). Это может касаться перехода на другую страницу, задержки выполнения текущего скрипта или другого - во всех этих случаях таймеры и команды запуска скриптов осуществляют паузы и задержки.

Довольно-таки странная ситуация, не так ли?

В реальности мы пытаемся избегать задержек, а здесь мы создаем искусственные.



Вы будете использовать такие команды как Pause и ScriptTimer для задержки выполнения скриптов, например, чтобы выполнить обработку данных или при ожидании ввода информации от пользователя. Есть две специфические команды, связанные с таймерами - с помощью команды PageTimer вы задаете задержку перед переходом на какую-либо страницу, а с помощью ExitTimer задается интервал времени, после истечения которого MMB закрывает проект.

Команда RunScript не будет выполнять никаких задержек - она немедленно запускает определенный скрипт.

Обе команды - и ScriptTimer, и RunScript не прерывают выполнение текущего скрипта, но ScriptTimer немедленно продолжит выполнение текущего скрипта после запуска другого, а RunScript будет ожидать завершения вызванного скрипта и только после этого продолжит выполнение текущего.

Все команды, связанные с таймерами, используют в качестве единицы времени миллисекунду. Одна секунда содержит 1000 миллисекунд, и вы будете часто использовать выражение n x 1000, чтобы оперировать в задержках с секундами.



Pause("мс")
Пояснение
Прерывает на указанное время дальнейшее выполнение текущего скрипта.

Примеры
** Задержка выполнения скрипта на 5 секунд (5000 мс)
Pause("5000")

** Задержка выполнения скрипта на 12 секунд (12000 мс) с использованием числовой переменной
delay=12000
Pause("delay")
Дополнительная информация
Эта команда обычно используется при ожидании завершения какой-либо внешней задачи (обработка данных, копирование) или при ожидании реакции пользователя.



RunScript("ИмяОбъекта")
Пояснение
Запускает скрипт, имя которого указано в качестве параметра.

Пример
** Запуск скрипта с именем "Calculate"
RunScript("Calculate")
Дополнительная информация
Запуск других скриптов спасает вас от повторения строк кода - рекомендуется размещать часто повторяющиеся операции в отдельные скрипты и запускать их, когда в них возникает необходимость. Строки, находящиеся ниже команды RunScript, в большинстве случаев будут ожидать завершения выполнения вызванного скрипта, что позволяет вам передавать в скрипт данные и получать их после обработки с помощью числовых и строковых переменных.

Для объектов, содержащих оба события - Mouse Up и Mouse Down, эта команда запускает скрипт по умолчанию (Mouse Up).

ВНИМАНИЕ! Не используйте команду RunScript для повторного вызова скрипта или события Mouse Up из самого себя. Это приведет к бесконечной рекурсии, так как команда RunScript ожидает завершения вызванного скрипта. При использовании подобного кода вы получите сообщение об ошибке: "Глубина рекурсии в скрипте достигла 50 уровней" ("Recursion in Script reached 50 levels"). Вы можете использовать вместо этого команду ScriptTimer, которая не ожидает завершения выполнения скрипта.



RunScriptCode("параметр1,параметр2")
Пояснение
Команда RunScriptCode выполняет скрипт из строки или строковой переменной. Это значит, что вы можете написать любой скрипт в текстовый файл, загрузить весь файл в строковую переменную (например, используя команду LoadText) и выполнить скрипт с помощью RunScriptCode. Это действительно так легко ;)

Возможные параметры:
параметр1 - строка или строковая переменная, содержащая исходный код скрипта
параметр2 - 0 = обработка кода без предупреждений, 1 = обработка с предупреждениями (отображение сообщений об ошибках)
Примеры
** Пример, показывающий как загрузить и выполнить скрипт из внешнего файла
LoadText("ExtScript$","<Embedded>\pagestart.txt")
RunScriptCode("ExtScript$","")


** Пример формирования кода непосредственно в скрипте
script$='For i=1 To 1000' + CHR(13) + CHR(10)
script$=script$ + 'm=m+1' + CHR(13) + CHR(10)
script$=script$ + 'Next i'
RunScriptCode("script$","")
Дополнительная информация
Запуск других скриптов спасает вас от повторения строк кода - рекомендуется размещать часто повторяющиеся операции во внешние или даже вложенные файлы и запускать их, когда в них возникает необходимость. Строки, находящиеся ниже команды RunScriptCode, будут ожидать завершения выполнения вызванного скрипта.

ВНИМАНИЕ! Не используйте команду RunScriptCode для вызова одного и того же скрипта из самого себя несколько раз. Это приведет к бесконечной рекурсии, так как команда RunScript ожидает завершения вызванного скрипта. При использовании подобного кода вы получите сообщение об ошибке: "Глубина рекурсии в скрипте достигла 50 уровней" ("Recursion in Script reached 50 levels"). Вы можете использовать вместо этого команду ScriptTimer, которая не ожидает завершения выполнения скрипта.



ScriptTimer("ИмяОбъекта","мс")
Пояснение
Ожидает в течение указанного времени (число или числовая переменная во втором параметре), затем начинает выполнение другого скрипта, имя которого указано в первом параметре:

ScriptTimer("ИмяСкрипта","Задержка")

Что бы увеличить ваши возможности, MMB предлагает 1000 независимых таймеров внутри команды ScriptTimer - Timer1...Timer1000.

Используя этот принцип, вы можете вызвать команду ScriptTimer 1000 раз, используя разные таймеры, и создать 1000 независимых потоков - каждый поток будет выполнять свой скрипт, не заботясь об остальных.

ПРИМЕЧАНИЕ: В предыдущих версиях было только три таймера - TimerA, TimerB и TimerC. Эти таймеры по-прежнему работают, и вы можете увидеть их в старых проектах и скриптах. Но мы не рекомендуем использовать их в новых проектах!

Использование этих таймеров начинается с указания имени таймера...

Timer
1,
Timer2, ...,
Timer1000

...и знака равенства в качестве префикса имени скрипта:

ScriptTimer("Timer1=ИмяСкрипта1","Задержка")

ScriptTimer("Timer2=ИмяСкрипта2","Задержка")

ScriptTimer("Timer3=ИмяСкрипта3","Задержка")



Примеры
** Запуск скрипта Script1 с восьмисекундной задержкой
ScriptTimer("Script1","8000")

** Запуск скрипта MyScript с задержкой, определяемой числовой переменной
delay=5500
ScriptTimer("MyScript","delay")

** Запуск скрипта ThreadScript с пятисекундной задержкой и использованием таймера 1
ScriptTimer("Timer1=ThreadScript","5000")
Дополнительная информация
Эта команда обычно используется при ожидании завершения какой-либо внешней задачи (обработка данных, копирование) или при ожидании реакции пользователя.

Команда ScriptTimer запускает скрипт только один раз, поэтому вы должны вызвать ScriptTimer еще раз, что бы запустить скрипт повторно.

В дополнение к этому, запуск ScriptTimer с новым значением задержки до истечения предыдущей сбросит значение, заданное ранее, и будет использовать новое.

Например, если вы выполните команду:

ScriptTimer("Script1","8000")

...и до истечения 8 секунд выполните команду еще раз:

ScriptTimer("Script2","12000")

...то предыдущее значение будет заменено новым и по истечении 12 секунд запустится Script2. Это также справедливо и для таймеров A, B и C.

Для объектов, содержащих оба события - Mouse Up и Mouse Down, эта команда запускает скрипт по умолчанию (Mouse Up).

Все запущенные скрипты (включая таймеры), если они запущены с обычной страницы, завершаются при переходе на другую страницу. Если вы хотите продолжить выполнение таймера даже если пользователь перешел на другую страницу, то поместите его на верхний или нижний мастер-слой и запустите его с префиксом Master Page:: или Master Layer:: (как это описано здесь).

После этого команда должна выглядеть следующим образом:

ScriptTimer("Master Page::Script","100")

...или так, если вы хотите использовать несколько таймеров:

ScriptTimer("Timer1=Master Page::Script","100")



PageTimer("мс","ИмяСтраницы")
Пояснение
Ожидает в течение указанного времени (число или числовая переменная в первом параметре) и затем либо открывает следующую страницу (если второй параметр не указан), либо страницу, имя которой указано в качестве второго параметра, либо выполняет одно из нижеописанных действий, в зависимости от второго параметра:

THIS_PAGE - перезагружает текущую страницу проекта (положение объектов, фоновая музыка) и выполняет скрипт по событию Page Start.

THIS_SCRIPT
- выполняет только стартовый скрипт текущей страницы.

IF_IDLE
- открывает следующую страницу, если в течение указанного времени не будут выполнены события, связанные с нажатием кнопок мыши или клавиатуры.



Примеры
** Переход на следующую страницу через 8 секунд
PageTimer("8000","")

** Переход на страницу "Page 7" через 20 секунд
PageTimer("20000","Page 7")

** Запуск стартового скрипта текущей страницы через 10 секунд
PageTimer("10000","THIS_SCRIPT")

** Перезагрузка текущей страницы через 5 секунд
PageTimer("5000","THIS_PAGE")

** Переход на следующую страницу, если в течение 60 секунд нет пользовательской активности
PageTimer("60000","IF_IDLE")
Дополнительная информация
Запуск PageTimer с новым значением задержки до истечения предыдущей сбросит значение, заданное ранее, и будет использовать новое.

Например, если вы выполните команду:

PageTimer("120000","")

...и до истечения 120 секунд выполните команду еще раз:

PageTimer("180000","")

...то предыдущее значение будет заменено новым и таймер переместит вас на следующую страницу через 180 секунд.

Использование команды ExitTimer после команды PageTimer отменяет ее действие.



ExitTimer("мс")
Пояснение
Ожидает в течение указанного времени (число или числовая переменная в качестве параметра) и затем закрывает проект. Если во время ожидания будет выполнено событие, связанное с нажатием кнопки мыши или клавиатуры, то действие команды будет отменено.

Пример
** Завершение проекта, если пользователь неактивен в течение 120 секунд
ExitTimer("120000")
Дополнительная информация
Запуск команды PageTimer до истечения таймера команды ExitTimer отменит действие ExitTimer.

Например, если вы выполните команду:

ExitTimer("120000","")

...и до истечения 120 секунд выполните команду PageTimer:

PageTimer("12000","")

...то PageTimer отменит действие команды ExitTimer.



Refresh("")
Пояснение
Обновляет окно проекта и позволяет обработку других событий в проекте (ввод с клавиатуры, запуск скриптов и так далее).

Вызов команды Refresh без параметра FORCED выполняет обычное обновление окна. Этого должно быть достаточно в большинстве случаев.

Чтобы выполнить принудительное обновление окна приложения и объектов, используйте параметр FORCED. Это поможет в тех случаях, когда обычная перерисовка становится неэффективной, например, при интенсивных операциях с графикой. Мы рекомендуем использовать этот параметр только тогда, когда возникают проблемы со стандартным обновлением окна.

Примеры
** Обновление окна
Refresh("")

** Принудительное обновление окна. Используйте его с осторожностью! Оно может снизить скорость работы вашего приложения
Refresh("FORCED")
Дополнительная информация
Вызов этой команды рекомендуется в циклах for..next, чтобы позволить обработку других потоков (выполняющихся в проекте скриптов) и предотвратить "замораживание" окна приложения.

MMB Программирование без границ :: dgilmour, перевод на русский язык, 2006 :: Все права защищены :: www.mmbscript.ru