Nota: O problema com delay
foi corrigido no OS X 10.11 El Capitan.
Desde que atualizei para o Yosemite, os scripts de maçã que usam atrasos pararam de funcionar. Como posso consertar isso?
Aqui está o Applescript mais simples do mundo, para um exemplo fácil:
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
Isso deve levar 30 segundos para ser concluído. Se eu executá-lo no Script Editor (anteriormente Applescript Editor), leva 30 segundos para ser concluído. Porém, se eu salvar esse script como um aplicativo, ao iniciá-lo, os atrasos serão ignorados e o aplicativo levará uma fração de segundo para ser concluído.
Como forçar o Applescript a adiar por um período especificado antes de prosseguir para a próxima etapa? Esta é uma falha de Yosemite? Existe uma solução alternativa confiável?
yosemite
applescript
2oh1
fonte
fonte
Respostas:
Nota: O problema com
delay
foi corrigido no OS X 10.11 El Capitan.@ 2oh1, você tem a idéia básica certa em sua resposta, mas aqui está uma resposta completa e correta:
A única maneira razoável de contornar isso é invocar o "atraso" dentro de um loop que garante a duração desejada antes de continuar. A melhor maneira de fazer isso é substituir o "atraso" por um manipulador personalizado:
Isso permite que você mantenha o restante do seu script inalterado e você pode usar o "atraso" normalmente, por exemplo,
[OBSERVAÇÃO: Normalmente, o manipulador personalizado usaria "continue delay duration" para chamar o "delay" interno, mas descobri que, embora isso funcione no Editor de scripts, ele retorna um erro quando usado em um applet ("Pode" t continue o atraso. (-1708) "). Eu resolvi esse problema dizendo diretamente ao AppleScript para manipular o comando delay em vez de usar "continue" para chegar lá.]
O problema é que
delay
processa a entrada do usuário durante a pausa do script, para que você ainda possa clicar nos menus ou janelas exibidos por um applet, e há um erro (corrigido no 10.11) em que a entrada do usuário fazdelay
com que não espere a duração total antes de continuar a execução do script . Se você não interagir com o applet,delay
funcionará corretamente.fonte
Enquanto lutava contra esse mesmo problema, me deparei com essa resposta para uma pergunta não tão relacionada e decidi tentar e parece funcionar para mim.
Simplesmente substitua
delay 5
pordo shell script "/bin/sleep 5"
e obtenha o mesmo resultado.fonte
/bin/sleep
aguarda a duração do sono e não retorna até que seja concluído. Por outro lado, odelay
comando interno do AppleScript lida com eventos de entrada do usuário enquanto o script está em pausa. (Que é onde as mentiras de bugs: se houver entrada de teclado do usuário,delay
continua a execução do script antes de a duração de atraso foi concluída.)Não estou dizendo que esta é a melhor solução, mas parece que resolveu meu problema. Em vez de usar um atraso simples, que está sendo ignorado por razões que não entendo, mudei para obter o tempo e fazer um loop até chegar um novo horário (ele ainda usa um atraso, mas não importa se ignora o atraso, já que o script não continua até a hora chegar).
Ainda estou morrendo de vontade de saber por que o atraso está sendo ignorado (ou acelerado dramaticamente?! ??), mas isso faz o trabalho, por mais desajeitado que seja.
fonte
delay
continuará sendo interrompido até que algo lide com os eventos e os remova da fila.Encontrei uma solução alternativa em um post no fórum alemão . Adicione estas linhas na parte superior do seu script:
fonte
delay
processa a entrada do usuário enquanto o script está em pausa, para que você ainda possa interagir com menus e janelas, por exemplo.carzyj teve o que considero a melhor resposta, mas quando combinado com o método de Chris Page, você obtém:
Você pode comentar "em atraso" a "atraso final" para reverter para o atraso original.
fonte
esta é uma modificação na solução @ chris-page
Parece haver um equilíbrio entre a capacidade de resposta e a captura precisa do atraso.
Mas, em vez de dizer ao Applescript para adiar a duração geral, apenas pedimos que adie por um período fracionário da duração. se o período for menor do que o permitido pela maçã (1/60 de segundo), vamos configurá-lo para esse delta. Que podemos manter alguma capacidade de resposta, mas ainda assim sermos precisos. a suspeita é que, às vezes, o atraso não funcione, e o loop repeat while manterá o encadeamento bloqueado, mas em cenários de sucesso, queremos que o delta do atraso seja curto para que o processo ainda possa ser interrompido
fonte
delay
atrasar o máximo possível antes de continuar a execução.delay endTime - (current date)
vez dedelay duration
, o que garante que, sedelay
não for interrompido, ele não pausará o script por mais tempo do que o pedido originalmente, o que pode ter sido o que você estava tentando endereço com esta resposta.Então, para juntar tudo, acredito que Chris quer dizer isso:
fonte