Перейти к основному содержимому

Как выполняются скрипты

  • Один поток на запуск. Каждый сработавший скрипт выполняется в собственном потоке, со своими переменными и кэшами перечислений. Два жеста, выполненные почти одновременно, работают параллельно. Именованная блокировка не даёт им перемешивать общую работу. Исключение — монитор 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, только если фрагмент выполнен до конца. Фрагмент разделяет контекст триггера вызывающего скрипта, но имеет собственные переменные.
  • Безопасный режим блокирует все скрипты, кроме запущенных из диагностической консоли.