Arreter une app à  partir d'une autre sans protocole

MathMath Membre
07:46 modifié dans API AppKit #1
Bonjour à  tous  <3 <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 ?  :o

Réponses

  • fouffouf Membre
    07:46 modifié #2
    Je pense à  deux possibiltées :
    1- la barbare : un kill (non, c'est vraiment trop méchant)
    2- le plus gentille : passer par des NSNotification et le NSDistributedNotificationCenter
  • BruBru Membre
    07:46 modifié #3
    dans 1139179498:

    1- la barbare : un kill (non, c'est vraiment trop méchant)


    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.

    .
  • BruBru Membre
    07:46 modifié #4
    dans 1139179498:

    Je pense à  deux possibiltées :


    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...

    .
  • MathMath Membre
    07:46 modifié #5
    Ok merci pour vos réponses  :p

    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):
  • 07:46 modifié #6
    Est-tu sur que faire un helper séparé soit la meilleure solution s'il ne doit tourner que en meme temps que ton appli?

    Parce qu'en fait, ça cause un problème: si ton appli se plante, le helper a de fortes chances de continuer à  tourner.
  • BruBru Membre
    07:46 modifié #7
    dans 1139218060:

    Est-tu sur que faire un helper séparé soit la meilleure solution s'il ne doit tourner que en meme temps que ton appli?
    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.

    .
  • 07:46 modifié #8
    Il est vrai qu'un applescript est la solution la plus simple  :p

    <br />NSDictionary *err;<br />NSAppleScript *applescript = [[NSAppleScript alloc] initWithSource:@&quot;tell application &#092;&quot;MonHelper&#092;&quot;&#092;nquit&#092;nend tell&quot;];<br />[applescript executeAndReturnError:&amp;err];<br />[applescript release];<br />
    

    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.

  • MathMath Membre
    07:46 modifié #9
    dans 1139218060:

    Est-tu sur que faire un helper séparé soit la meilleure solution s'il ne doit tourner que en meme temps que ton appli?

    Parce qu'en fait, ça cause un problème: si ton appli se plante, le helper a de fortes chances de continuer à  tourner.


    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.


    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.


    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).
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #10
    Le plus adapté pour moi est soit une notification distribuée, soit un signal (SIGTERM par exemple étant le plus adapté)

    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.
  • MathMath Membre
    07:46 modifié #11
    J'ai fait la chose en utilisant le code de Eaglelouk et ça marche impec.

    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 ?
  • BruBru Membre
    07:46 modifié #12
    dans 1139231207:

    Au niveau des signaux (ça m'interesse aussi) comment on envoi y SIGTERM ?


    Par la fonction kill(pid_t pid, int sig).

    .
  • elfelf Membre
    07:46 modifié #13
    SIGTERM, SIGKILL etc. sont-elles des variables globale?

    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
  • AliGatorAliGator Membre, Modérateur
    07:46 modifié #14
    SIG_KILL & co sont des constantes qui sont dans <signal.h> dans lequel la fonction C kill est définie.
    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.
Connectez-vous ou Inscrivez-vous pour répondre.