Один поток на запуск. Каждый сработавший скрипт выполняется в собственном потоке, со своими
переменными и кэшами перечислений. Два жеста, выполненные почти одновременно, работают
параллельно. Именованная блокировка не даёт им перемешивать общую работу. Исключение —
монитор COM-порта: его строки обрабатываются по одной, в порядке поступления.
Скрипт может блокироваться.UtilityWait, окна сообщений, ShellRunProgram с ожиданием
завершения и чтение из COM-порта блокируют поток своего скрипта и больше ничего. Ввод с мыши и
клавиатуры продолжает поступать.
Остановка. Горячая клавиша остановки всех действий и EngineStopAllActions() завершают
каждый выполняющийся скрипт на его следующей инструкции, поэтому бесконечный цикл всегда можно
остановить. UtilityWait, блокировка и ожидание данных COM-порта, ShellRunProgram с ожиданием
завершения, ShellShowToast, MultimediaPlayMp3File и UIShowConsole тоже замечают запрос на
остановку во время ожидания. Последние четыре тогда возвращают false, а ShellRunProgram
оставляет программу работать. Остальные встроенные функции сначала завершают текущий вызов.
Что сохраняется между запусками:
Storage*: именованные значения любого типа, общие для всех скриптов, хранятся в памяти, пока
работает движок. StorageGetValue для имени, которое никогда не задавалось, возвращает
Integer 0. Хранится до 1 024 значений с именами до 256 символов и Text до 32 768
символов; превышение предела останавливает действие с ошибкой.
Свойства окна (WindowSetPropertyInteger/…Text): значения, привязанные к одному окну и
исчезающие при его закрытии или при завершении работы Input.Observer. Текстовое значение —
не более 1 024 символов, одновременно можно хранить до 512 текстовых значений.
Именованные таймеры, отслеживание папок и мониторы COM-портов, которые движок продолжает
выполнять после завершения создавшего их скрипта.
Скрипты, переданные как Text.TimerCreate, FolderWatchCreate и SerialMonitorCreate
принимают скрипт в виде аргумента Text. Он компилируется и запускается отдельно при каждом
срабатывании, поэтому у него свежие переменные и он не видит переменных создавшего его скрипта.
Кавычки внутри него требуют экранирования \"; либо держите скрипт во фрагменте и передавайте
SnippetGetScript("name").
Контекст. Встроенные функции Context* описывают то, что запустило текущее выполнение: жест,
его точки и ограничивающий прямоугольник, окно и элемент управления под ним, кнопку, событие
отслеживания или строку с COM-порта. У скрипта таймера нет контекста триггера. Скрипт
отслеживания папки получает значения ContextGetWatch*, а скрипт монитора COM-порта — значения
ContextGetSerial*.
Фрагменты — именованные скрипты в конфигурации. SnippetExecuteScript выполняет фрагмент до
конца, прежде чем вызывающий скрипт продолжит работу, и возвращает true, только если фрагмент
выполнен до конца. Фрагмент разделяет контекст триггера
вызывающего скрипта, но имеет собственные переменные.
Безопасный режим блокирует все скрипты, кроме запущенных из диагностической консоли.