Pular para o conteúdo principal

Como os scripts são executados

  • Uma thread por disparo. Cada script disparado é executado em uma thread própria, com as suas próprias variáveis e caches de enumeração. Dois gestos disparados em sequência rápida são executados ao mesmo tempo. Um bloqueio nomeado impede que eles intercalem um trabalho compartilhado. Um monitor serial é a exceção: as linhas dele são executadas uma de cada vez, na ordem em que chegaram.
  • Um script pode ficar bloqueado. UtilityWait, caixas de mensagem, um ShellRunProgram que aguarda o programa terminar e as leituras seriais bloqueiam a thread do próprio script, e nada mais. A entrada do mouse e do teclado continua fluindo.
  • Interrupção. A tecla de atalho de parar todas as ações e EngineStopAllActions() encerram todo script em execução na sua próxima instrução, então um loop infinito sempre pode ser interrompido. UtilityWait, o bloqueio e as esperas seriais, um ShellRunProgram que aguarda o programa terminar, ShellShowToast, MultimediaPlayMp3File e UIShowConsole também percebem um pedido de interrupção enquanto aguardam. Os quatro últimos então retornam false, e ShellRunProgram deixa o programa em execução. As demais funções internas terminam a chamada atual antes.
  • O que persiste entre execuções:
    • Storage*: valores nomeados de qualquer tipo, compartilhados por todos os scripts e mantidos na memória enquanto o mecanismo estiver em execução. StorageGetValue de um nome que nunca foi definido retorna Integer 0. Ele guarda até 1.024 valores, com nomes de até 256 caracteres e Text de até 32.768 caracteres; ultrapassar um limite interrompe a ação com um erro.
    • Propriedades de janela (WindowSetPropertyInteger/…Text): valores associados a uma janela que desaparecem quando ela é fechada ou quando o Input.Observer sai. Um valor de texto tem no máximo 1.024 caracteres, e até 512 valores de texto podem ser armazenados ao mesmo tempo.
    • Temporizadores nomeados, monitoramentos de pastas e monitores seriais, que o mecanismo mantém em execução depois que o script que os criou termina.
  • Scripts passados como Text. TimerCreate, FolderWatchCreate e SerialMonitorCreate recebem um script como argumento Text. Ele é compilado e disparado separadamente a cada vez que é acionado, então tem variáveis novas e não enxerga as variáveis do script que o criou. As aspas dentro dele precisam do escape \"; ou mantenha o script em um snippet e passe SnippetGetScript("name").
  • Contexto. As funções internas Context* descrevem o que disparou a execução atual: o gesto, os seus pontos e o retângulo delimitador, a janela e o controle sob ele, o botão, o evento do monitoramento ou a linha serial. O script de um temporizador não tem contexto de gatilho. O script de um monitoramento de pasta recebe os valores de ContextGetWatch*, e o de um monitor serial recebe os valores de ContextGetSerial*.
  • Snippets são scripts nomeados na configuração. SnippetExecuteScript executa um até o fim antes que o chamador continue, e retorna true somente quando o snippet foi executado até o fim. Ele compartilha o contexto de gatilho do chamador, mas tem as suas próprias variáveis.
  • O Modo de segurança bloqueia todos os scripts, exceto os executados pelo console de diagnóstico.