跳到主要内容

脚本的运行方式

  • 每次分派一个线程。每个被触发的脚本都在自己的线程上运行,拥有自己的变量和枚举缓存。两个相继很快触发的手势会同时运行。命名锁可以防止它们交错执行共享的工作。串口监视器是例外:它的各行按到达顺序逐一运行。
  • 脚本可以阻塞。UtilityWait、消息框、等待程序退出的 ShellRunProgram 以及串口读取,都只会阻塞其所在脚本的线程,不影响其他任何内容。鼠标和键盘输入照常传递。
  • 停止。“停止所有操作”热键和 EngineStopAllActions() 会让每个正在运行的脚本在下一条指令处结束,因此死循环总是可以被停止。UtilityWait、锁和串口等待、等待程序退出的 ShellRunProgram、ShellShowToast、MultimediaPlayMp3File 和 UIShowConsole 在等待期间也会察觉停止请求。后四者随后返回 false,且 ShellRunProgram 会让程序继续运行。其他内置函数会先完成当前调用。
  • 运行之间保留的内容:
    • Storage*:任意类型的命名值,由所有脚本共享,只要引擎在运行就一直保存在内存中。对从未设置过的名称调用 StorageGetValue 会返回 Integer 0。最多可保存 1,024 个值,名称最多 256 个字符,Text 最多 32,768 个字符;超出限制会使操作因错误而停止。
    • 窗口属性(WindowSetPropertyInteger/…Text):附加到某个窗口上的值,该窗口关闭或 Input.Observer 退出时随之消失。一个文本值最多 1,024 个字符,同时最多可存储 512 个文本值。
    • 命名计时器、文件夹监视和串口监视器:创建它们的脚本结束后,引擎会继续运行它们。
  • 以 Text 形式传递的脚本。TimerCreate、FolderWatchCreate 和 SerialMonitorCreate 以 Text 参数的形式接收一段脚本。每次触发时,这段脚本都会单独编译并分派,因此它拥有全新的变量,看不到创建它的脚本中的变量。其中的引号需要用 \" 转义,或者将脚本保存在代码片段中并传入 SnippetGetScript("name")。
  • 上下文。Context* 内置函数描述触发本次运行的内容:手势、其点和边界框、其下方的窗口和控件、按钮、监视事件或串口行。计时器的脚本没有触发上下文。文件夹监视的脚本可获取 ContextGetWatch* 的值,串口监视器的脚本可获取 ContextGetSerial* 的值。
  • 代码片段是配置中的命名脚本。SnippetExecuteScript 会将其运行完毕,然后调用方才继续;只有代码片段运行到结尾时才返回 true。它与调用方共享触发上下文,但拥有自己的变量。
  • 安全模式会阻止所有脚本运行,从诊断控制台运行的脚本除外。