Copie Applescript 2e problème

Maxmad68

Membre actif
27 Octobre 2014
313
17
Strasbourg
github.com
Bonjour,
Encore un problème avec Applescript Obj-C
J'aimerais faire une copie de GROS dossier (plus de 10go parfois), sauf que pendant la copie, mon programme affiche un moulin coloré indiquant que ça bug, alors que la copie se fait bien, et le moulin s'enlève quand la copie est terminée.
Comment puis-je faire pour que ce moulin coloré ne soit plus là pendant les copies et qu'in puisse encore interagir avec l'interface du programme?

Merci
 
Bonjour,

Ce n'est pas un bogue, c'est que l'application ne répond plus lors de la copie

La solution serait d'utiliser une méthode qui s'exécute en arrière-plan :
Voici le code pour appeler la méthode copySomething()
Bloc de code:
performSelectorInBackground_withObject_("copySomething",missing value)

Voici la méthode copySomething(), avec un exemple de code, change-le par celui de ton script
Bloc de code:
    on copySomething()
        set source to choose folder
        set dest to "Macintosh HD:Users:moi:Desktop:dossier sans titre 7:" as alias
        tell application "Finder"
            duplicate source to dest
        end tell
    end copySomething

Lors de la copie, ton interface ne sera pas bloquée.

Solution alternative, si tu utilise le Finder pour copier des éléments, est ignoring application responses
Bloc de code:
ignoring application responses
    tell application "Finder" to duplicate source to dest
end ignoring
Avec cela, le script continue sans attendre la fin de la copie
 
Bonjour, en référence à l'autre discussion, [[il serait plus simple de n'en faire qu'une ; puisqu'il s'agit du même sujet]] ; votre ``thread est le main-thread (1) vous exécutez une action bloquante sur celui-ci ; donc vous obtenez la spinball ; c'est la raison même de celle-ci.

1- ou application-thread, d'ailleurs applescript ne connait que ceci, c.a.d un seul thread. Sous mac cela correspond aussi à l' ``ui-thread , ce n'est pas vrai sous tous les systèmes.

Notez, qu'il n'y a aucun moyen de créer un mécanisme de ```signaling-theading en applescript donc vous ne pouvez pas savoir quand le task se termine et dans quelle (s) condition(s) ; si vous avez besoin de plus de contrôle, orientez vous vers autre chose: cocoa.


Bloc de code:
-- async

on func_posix_shell_exec_fork(cmd)
    set pid to do shell script cmd & space & "& echo $!"
    return pid
end func_posix_shell_exec_fork

on func_posix_shell_exec_fork_nohup(cmd)
    set pid to do shell script "/usr/bin/nohup" & space & cmd & space & "& echo $!"
    return pid
end func_posix_shell_exec_fork_nohup

on func_posix_shell_kill_pid(pid)
    set cmd to "/bin/kill -s 0" & space & pid
    return func_posix_shell_exec(cmd)
end func_posix_shell_kill_pid

on func_posix_shell_pid_exists(pid)
    set cmd to "/bin/ps --pid" & space & pid & space & "&>/dev/null"
    return func_posix_shell_exec(cmd)
end func_posix_shell_pid_exists

on func_posix_shell_wait_on_pid(pid)
    set cmd to "/usr/bin/wait" & space & pid
    return func_posix_shell_exec(cmd)
end func_posix_shell_wait_on_pid

-- end async
 
Dernière édition:
Ok merci, mais alors comment je peux faire pour les deux en même temps?
Le but, c'est de copier un dossier de plusieurs go avec une barre de progression qui augmente, et même avec les codes de JaquR, la barre n'augmente pas et le moulin coloré apparait
Pire, la copie s'arrête à la moitié avec pour erreur :"Erreur de composant de script"
Help!
 
L'application se bloque si vous utiliser une boucle pour mettre à jour une barre de progression ou lorsqu'un code s'execute pendant plusieurs secondes, comme expliquer par Mboum

Pour que cela fonctionne correctement :
performSelectorInBackground_withObject_(...) doit être la dernière ligne à s'éxecuter dans une action (dans un bouton par exemple).
Sinon s'il y a d'autre lignes de code après performSelectorInBackground_withObject_(...) cela bug ou ne fonctionne pas correctement.
Bloc de code:
    on buttonClicked_(sender)
             -- quelques lignes lignes de code
             -- quelques lignes lignes de code
             -- quelques lignes lignes de code
             performSelectorInBackground_withObject_("copySomething",missing value)
    end buttonClicked_

    on copySomething()
        set source to choose folder
        set dest to "Macintosh HD:Users:jack:Desktop:dossier sans titre 7:" as alias
        tell application "Finder"
            duplicate source to dest
        end tell
    end copySomething

J’ai testé ceci, et j’ai cliqué 5 fois sur le bouton "Copie ...", j'ai choisi 5 dossiers différents, et la copie de ces gros dossiers se faisait simultanément pendant que je cliquais sur le bouton "Copie ..." sans que l’application se bloque.
Les 5 copies se sont fait sans erreurs.​
 
Merci pour vos réponses
La source et destination sont définis dans l'action qui va appeler copySomething() (ici buttonClicked_() ), comment puis-je faire pour les transmettre à la fonction copySomething() ? Property ne fonctionne pas (sais pas pourquoi, mais ça marche pas...)
Sinon, ignoring application responses marche très bien

Y a t'il une solution pour le faire marcher de sorte à ce que FileManager fasse lui la copie?, j'aimerais masquer la fenêtre du Finder indiquant la progression de la copie
On m'a dit que FileManager était là pour ça dans mon autre topic
Je sais, je cherches compliqué :-/
 
Merci pour vos réponses
La source et destination sont définis dans l'action qui va appeler copySomething() (ici buttonClicked_() ), comment puis-je faire pour les transmettre à la fonction copySomething() ? Property ne fonctionne pas (sais pas pourquoi, mais ça marche pas...)
Sinon, ignoring application responses marche très bien

Y a t'il une solution pour le faire marcher de sorte à ce que FileManager fasse lui la copie?, j'aimerais masquer la fenêtre du Finder indiquant la progression de la copie
On m'a dit que FileManager était là pour ça dans mon autre topic
Je sais, je cherches compliqué :-/

Comme ceci

Bloc de code:
  on buttonClicked_(sender)
       -- bla
       -- bla
        performSelectorInBackground_withObject_("copyItems:",{POSIX path of source, POSIX path of dest})
    end buttonClicked_
  
    on copyItems:L
        set fm to current application's NSFileManager's defaultManager()
        set thisItem to item 1 of L
        set tname to thisItem's lastPathComponent-- récupère le nom  de l'élément à copier
        set dest to (item 2 of L)'s stringByAppendingPathComponent:tname -- ceci ajoute le nom de l'élément à copier au dossier de destination (obligatoire)
        fm's copyItemAtPath:thisItem toPath:dest |error|:missing value
    end copyItems