Arreter une app à partir d'une autre sans protocole
Math
Membre
Bonjour à tous <br />
Je suis en train de créer une nouvelle petite application et je bute sur un problème.
Mon application au démarrage lance une petite app (un helper). Pour ça y a pas de problème... mais avant de quitter il faudrait que j'arrête le helper.
Y a t-il un moyen simple de le faire sans passer par un protocol entre les deux ?
Je suis en train de créer une nouvelle petite application et je bute sur un problème.
Mon application au démarrage lance une petite app (un helper). Pour ça y a pas de problème... mais avant de quitter il faudrait que j'arrête le helper.
Y a t-il un moyen simple de le faire sans passer par un protocol entre les deux ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
1- la barbare : un kill (non, c'est vraiment trop méchant)
2- le plus gentille : passer par des NSNotification et le NSDistributedNotificationCenter
KILL barbare ?
Tu vas un peu vite en besogne.
KILL permet d'envoyer un "signal" à un appli.
Il y a plusieurs signaux, dont l'un, SIGTERM, qui demande à l'appli cible de se terminer tranquillement. D'ailleurs, l'appli peut très bien ne pas répondre au message, et donc de continuer à tourner.
Seul le signal SIGKILL peut être qualifié de barbare, car il tue effectivement le process sans rien demander.
.
Il y en a une troisième : Applescript.
En recherchant dans Google, tu trouveras différents bouts de programme sous cocoa qui permettent d'envoyer un événement Apple Quit à une autre appli...
.
C'est vrai qu'il y a aussi les notifications (belle invention que ça).
Je pense choisir les notifications à moins que je regarde comment marchent les protocoles ça sera une occasion d'apprendre un truc de plus :fouf):
Parce qu'en fait, ça cause un problème: si ton appli se plante, le helper a de fortes chances de continuer à tourner.
Si son helper est sans UI, il peut alors le lancer de son programme via NSTask.
Dans ce cas, le helper aura comme parent-pid celui de l'appli qui l'a lancé.
La conséquence est : dès la fin de l'appli parente, tous les child-process sont terminés.
.
Le problème de l'applescript c'est que ça peut mettre jusquà 3 secondes à s'executer (la première fois).
Je connais mal le NSTask alors je ne peut pas t'aider sur cette solution.
Louka.
Ouais vu comme ça c'est sur, mais en fait le helper tourne en permanence en tache de fond si l'utilisateur le décide.
Donc soit le helper est lancé et arrêté en même temps que l'appli. Soit il est lancé une fois et placé dans les élements à lancer au démarrage et tourne ensuite sans l'application principale.
Il n'y a effectivement pas d'interface, c'est une appli cocoa avec LSUIElement à 1.
Merci Eaglelouk, je vais tester (c'est effectivement très simple).
Ce n'est pas parce que "kill" a un nom qui peut faire peur et surtout qu'il est utilisé en ligne de commande souvent en mode "kill -9" (envoi du signal SIGKILL assez barbare) que utiliser "kill" est toujours barbare !
Donc de ce côté je suis d'accord avec Bru, un signal n'est pas brutal et peut être un moyen très simple pour demander gentillement à une application de quitter.
Ce soir j'aurai un peu plus de temps je ferai ça avec une notification.
Au niveau des signaux (ça m'interesse aussi) comment on envoi y SIGTERM ?
Par la fonction kill(pid_t pid, int sig).
.
Sinon comment peut-tu connaitre le pid d'un proccès?
Sinon Math, je crois que le plus adapté pour ton cas c'est les notif's
Il suffit de faire un "man 2 kill" pour voir tous les détails.
Donc utilisables directement dès l'instant où tu as inclus le <signal.h> qui est de toutes façons nécessaires pour la fonction kill.
Pour le PID : Soit c'est toi qui as lancé le helper, et donc tu est son parent (le ppid du helper sera le pid de ton appli).
Si tu fait comme pas mal de systèmes (Apache, et j'en passe) à créer un fichier machin.pid et le helper inscrit son PID dedans à son lancement. Ce qui a aussi l'avantage de savoir si l'application s'est terminée proprement (car l'idée c'est de supprimer le fichier machin.pid quand tu quittes le helper, donc s'il existe encore à son second lancement c'est que soit il y a plusieurs copies du helper, soit qu'il a planté au coup d'avant)
Enfin bon y'a de quoi faire.