Je dois mettre en place un dossier de veille qui exécute un script sur chaque élément ajouté. Mais le script pourrait prendre 10 minutes ou plus pour traiter un seul élément.
Ce que j'ai fait, c'est mettre ce code en haut de mon script qui continue à surveiller le dossier et agit quand quelque chose est ajouté :
set watchFolderAlias to (POSIX file watchFolder as alias)
set r to {}
repeat
tell application "Finder" to set r to ¬
(sort (get files of watchFolderAlias whose kind is "alias") ¬
by creation date)
if (count of r) != 0 then
do(first item of r as alias)
end if
delay 5
end repeat
on do(x)
(* do 10 minutes of stuff with x *)
end do
... et ensuite je le laisse tourner. Mais c'est encombrant et maladroit.
Mais si j'attache le do()
en tant qu'action de dossier, il lancera une nouvelle instance dès qu'un élément sera ajouté... n'est-ce pas ?
Ai-je manqué une solution plus élégante ?
(Pour clarifier : si vous attachez une action de dossier script à un dossier, ce script est lancé . multiple une fois, une fois pour chaque fois que vous ajoutez des éléments au dossier, indépendamment de de savoir si une autre instance dudit script est déjà en cours d'exécution. C'est ce que j'essaie d'éviter. Par exemple, si 10 éléments sont déposés dans le dossier de veille, et qu'ensuite, alors que les 10 premiers éléments sont toujours en cours de traitement, 5 autres éléments sont déposés, cela lancera une instance de deuxième instance du script.)
La seule autre chose que je peux trouver est de maintenir un fichier "status" qui sera mis à "busy" par le script, et "idle" quand le traitement est terminé, de sorte que les autres instances du script attendront l'état "idle" ... mais cela est également maladroit.