Zum Hauptinhalt springen

Wie Skripts ausgeführt werden

  • Ein Thread pro Auslösung. Jedes ausgelöste Skript läuft in einem eigenen Thread, mit eigenen Variablen und Aufzählungscaches. Zwei kurz nacheinander ausgelöste Gesten laufen gleichzeitig. Eine benannte Sperre verhindert, dass sich ihre gemeinsame Arbeit überschneidet. Ein serieller Monitor ist die Ausnahme: Seine Zeilen laufen nacheinander, in der Reihenfolge ihres Eintreffens.
  • Ein Skript kann blockieren. UtilityWait, Meldungsfenster, ein ShellRunProgram, das auf das Programmende wartet, und serielle Lesevorgänge blockieren nur den Thread ihres eigenen Skripts und sonst nichts. Maus- und Tastatureingaben laufen weiter.
  • Beenden. Der Hotkey zum Beenden aller Aktionen und EngineStopAllActions() beenden jedes laufende Skript bei seiner nächsten Anweisung, sodass sich eine Endlosschleife immer anhalten lässt. UtilityWait, die Sperre und serielle Wartevorgänge, ein ShellRunProgram, das auf das Programmende wartet, ShellShowToast, MultimediaPlayMp3File und UIShowConsole bemerken eine Beendigungsanforderung auch während des Wartens. Die letzten vier geben dann false zurück, und ShellRunProgram lässt das Programm weiterlaufen. Andere integrierte Funktionen beenden zuerst ihren aktuellen Aufruf.
  • Was zwischen Ausführungen erhalten bleibt:
    • Storage*: benannte Werte jedes Typs, von allen Skripts gemeinsam genutzt und im Speicher gehalten, solange die Engine läuft. StorageGetValue für einen Namen, der nie gesetzt wurde, gibt Integer 0 zurück. Er fasst bis zu 1.024 Werte, mit Namen bis zu 256 Zeichen und Text bis zu 32.768 Zeichen; das Überschreiten einer Grenze beendet die Aktion mit einem Fehler.
    • Fenstereigenschaften (WindowSetPropertyInteger/…Text): an ein Fenster angehängte Werte, die verschwinden, wenn es geschlossen oder Input.Observer beendet wird. Ein Textwert hat höchstens 1.024 Zeichen, und bis zu 512 Textwerte können gleichzeitig gespeichert sein.
    • Benannte Timer, Ordnerüberwachungen und serielle Monitore, die die Engine weiterlaufen lässt, nachdem das Skript, das sie erstellt hat, beendet ist.
  • Als Text übergebene Skripts. TimerCreate, FolderWatchCreate und SerialMonitorCreate übernehmen ein Skript als Text-Argument. Es wird bei jedem Auslösen eigenständig kompiliert und ausgeführt, hat also frische Variablen und sieht die Variablen des Skripts, das es erstellt hat, nicht. Anführungszeichen darin brauchen \"-Escapes; alternativ legen Sie das Skript in einem Snippet ab und übergeben SnippetGetScript("name").
  • Kontext. Context*-Funktionen beschreiben, was die aktuelle Ausführung ausgelöst hat: die Geste, ihre Punkte und ihr umgebendes Rechteck, das Fenster und Steuerelement darunter, die Taste, das Überwachungsereignis oder die serielle Zeile. Das Skript eines Timers hat keinen Auslöserkontext. Das Skript einer Ordnerüberwachung erhält die ContextGetWatch*-Werte, das eines seriellen Monitors die ContextGetSerial*-Werte.
  • Snippets sind benannte Skripts in der Konfiguration. SnippetExecuteScript führt eines vollständig aus, bevor der Aufrufer fortfährt, und gibt nur dann true zurück, wenn das Snippet bis zum Ende gelaufen ist. Es teilt den Auslöserkontext des Aufrufers, hat aber eigene Variablen.
  • Der abgesicherte Modus blockiert alle Skripts außer denen, die in der Diagnosekonsole ausgeführt werden.