Remarque: Le problème avec a delay
été résolu dans OS X 10.11 El Capitan.
Depuis que je suis passé à Yosemite, les scripts Apples qui utilisent des retards ont cessé de fonctionner. Comment puis-je réparer cela?
Voici le plus simple Applescript du monde, pour un exemple simple:
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
Cela devrait prendre 30 secondes. Si je l'exécute dans Script Editor (anciennement Applescript Editor), cela prend 30 secondes. Mais si j'enregistre ce script en tant qu'application, lorsque je lance l'application, les retards sont ignorés et l'application prend une fraction de seconde pour se terminer.
Comment puis-je forcer Applescript à attendre un certain temps avant de passer à l'étape suivante? Est-ce un problème de Yosemite? Existe-t-il une solution de contournement fiable?
la source
Réponses:
Remarque: Le problème avec a
delay
été résolu dans OS X 10.11 El Capitan.@ 2oh1, vous avez la bonne idée de base dans votre réponse, mais voici une réponse complète et correcte:
La seule façon raisonnable de contourner ce problème consiste à invoquer un "retard" dans une boucle qui garantit que la durée souhaitée s'écoule avant de continuer. La meilleure façon de le faire est de remplacer le "délai" avec un gestionnaire personnalisé:
Cela vous permet de laisser le reste de votre script inchangé et vous pouvez utiliser "delay" normalement, par exemple,
[REMARQUE: Normalement, le gestionnaire personnalisé utilise la «durée du délai continue» pour appeler le «délai» intégré, mais j'ai constaté que, bien que cela fonctionne dans l'éditeur de script, il renvoie une erreur lorsqu'il est utilisé dans une applet («Can» t continuer le retard. (-1708) ”). J'ai contourné ce problème en disant directement à AppleScript de gérer la commande de délai au lieu d'utiliser "continuer" pour y arriver.]
Le problème est que
delay
les entrées utilisateur sont traitées pendant la pause du script, vous pouvez donc toujours cliquer sur les menus ou les fenêtres affichés par une applet, et il y a un bogue (corrigé dans 10.11) où l'entrée utilisateur faitdelay
attendre plus longtemps avant de reprendre l'exécution du script. . Si vous n'interagissez pas avec l'applet,delay
fonctionne correctement.la source
Tout en luttant contre ce même problème, je suis tombé sur cette réponse à une question peu liée et j'ai décidé de l'essayer et cela semble fonctionner pour moi.
Remplacez simplement
delay 5
pardo shell script "/bin/sleep 5"
et obtenez le même résultat.la source
/bin/sleep
attend la durée du sommeil et ne revient pas tant qu'elle n'est pas terminée. En revanche, ladelay
commande intégrée d'AppleScript gère les événements d'entrée utilisateur pendant la pause du script. (C'est là que réside le bogue: s'il y a une saisie au clavier de l'utilisateur,delay
continue l'exécution du script avant la fin du délai.)Je ne dis pas que c'est la meilleure solution, mais cela semble avoir résolu mon problème. Au lieu d'utiliser un simple délai, qui est ignoré pour des raisons que je ne comprends pas, je suis passé à obtenir l'heure et à boucler jusqu'à ce qu'une nouvelle heure soit atteinte (il utilise toujours un délai, mais peu importe s'il ignore le délai depuis le script ne continue pas jusqu'à ce que le temps soit atteint).
Je meurs d'envie de savoir pourquoi le retard est ignoré (ou accéléré de façon spectaculaire?! ??), mais cela fait le travail, aussi maladroit soit-il.
la source
delay
il continuera d'être interrompu jusqu'à ce que quelque chose gère les événements et les supprime de la file d'attente.J'ai trouvé une solution dans un message sur un forum allemand . Ajoutez ces lignes en haut de votre script:
la source
delay
traite les entrées utilisateur pendant que le script est en pause, vous pouvez donc toujours interagir avec les menus et les fenêtres, par exemple.carzyj a eu ce que je considère comme la meilleure réponse, mais lorsqu'il est combiné avec la méthode de Chris Page, vous obtenez:
Vous pouvez commenter "sur délai" à "délai de fin" pour revenir au délai d'origine.
la source
ceci est une modification de la solution @ chris-page
Cela semble être un équilibre entre la réactivité et la capture précise du retard.
Mais au lieu de dire à Applescript de retarder pour la durée totale, nous lui disons simplement de retarder pour une période fractionnaire de la durée. si la période est inférieure à ce qu'Apple autorise (1/60 de seconde), nous allons simplement le régler sur ce delta. Que nous pouvons garder une certaine réactivité, tout en restant précis. le soupçon est que parfois le délai ne fonctionne pas, de sorte que la boucle de répétition tandis que le thread reste verrouillé, mais dans les scénarios de réussite, nous voulons que le delta de délai soit court afin que le processus puisse toujours être interrompu
la source
delay
qui permet de retarder autant que possible avant de poursuivre l'exécution.delay endTime - (current date)
place dedelay duration
, ce qui garantit que s'ildelay
n'est pas interrompu, il ne mettra pas le script en pause plus longtemps que l'heure initialement demandée, ce qui pourrait être ce que vous essayiez de faire. adresse avec cette réponse.Donc, pour mettre tout cela ensemble, je crois que Chris veut dire ceci:
la source