Communication entre application [Résolu]

wiskywisky Membre
février 2006 modifié dans API AppKit #1
J'ai créée plusieurs application et j'aimera qu'elle puisse dialoguer entre elle.

J'ai une appli caché (pseudo deamon)
et mon appli visible

dans un certain contexte les deux font la même chose. Donc j'aimerai dire à  l'appli caché de suspendre sont activité de temps que l'appli visible fasse sont action pour éviter les conflits et collision d'action.

Peut-on demander à  l'appli caché de recevoir un message qui serait envoyé par l'autre appli via le "notificationCenter"?

Réponses

  • Eddy58Eddy58 Membre
    09:23 modifié #2
    Oui, par le NSDistributedNotificationCenter. :)
  • AliGatorAliGator Membre, Modérateur
    09:23 modifié #3
    Regarde du côté des mutex et sémaphores aussi, c'est typiquement pour faire ce genre de trucs.
    Je ne sais pas ce qu'il y a dans le framework Cocoa pour implémenter les mutex et semaphores (NSLock un truc du genre ? aucune idée jamais cherché) mais c'est un classique dans la programmation "temps réel" comme dans la programmation d'environnements partagés (principe du jeton que chacun doit prendre poru utiliser la resource et libérer quand il a fini)

    Dans les implémentations basiques, les mutex sont propres à  l'application (une application multithreads, bien sûr). Mais en général on peut partager un mutex (on lui donne un nom qui est partagé par tous les process). Ce qui correspondrait à  ton cas.
    A voir comment c'est implémenté dans Cocoa.

    (Sinon tu implémentes le système de prise de jeton en utilisant les NSDistributedNotification, mais vérifie que c'est thread-safe et que tu ne risques pas d'avoir de deadlocks)
  • ChachaChacha Membre
    09:23 modifié #4
    Sinon on peut se tourner vers du code C UNIX.
    Si ton appli principale envoie le signal SIGINT à  l'autre, cette dernière va s'endormir jusqu'à  recevoir le signal SIGCONT.

    exemple:
    kill(le-pid-de-l'autre-appli, SIGINT);
    //l'appli cachée est endormie...
    //je fais des trucs...

    kill(le-pid-de-l'autre-appli, SIGCONT);
    //pouf, l'appli cachée est reveillée

    Maintenant il faut connaà®tre le pid de l'autre appli.
    Une appli connaà®t facilement son propre pid (getpid()), mais elle devra le communiquer d'une façon ou d'une autre à  ton appli principale.
    Si ton appli cachée a été créée avec fork() et exec(), c'est plus facile (encore faut-il savoir ce que sont fork() et exec(), ça demande des explications si tu ne connais pas)

    Au fait: "pid" : Process-id, c'est le nombre qui identifie un programme en cours d'exécution; on peut trouver ces nombres dans le Moniteur d'activité.

    Le problème de la notification, c'est que tu pourras facilement dire à  ton appli cachée de s'endormir, mais comment la réveilleras-tu ?

    +
    Chacha
  • wiskywisky Membre
    09:23 modifié #5
    Ta façon de faire me plait bien chacha, mais l'appli caché ne communique pas son id.
    Je test en premier avec le NSDistributedNotificationCenter et si ça marche je laisse comme ça.
    avec NSDistributedNotificationCenter l'applica caché ne va pas s'endormir elle va stopper la surveilance.
  • AliGatorAliGator Membre, Modérateur
    09:23 modifié #6
    La solution mixte qui tue : utiliser les NSDistributedNotification pour que l'appli 2 communique son pid à  l'appli 1.
    Puis envoyer un SIGINT pour stopper, et un SIGCONT pour relancer :D

    Mais bon quitte à  passer par des NSDistributedNotifications, si tu contrôle bien ta ressource partagée, tu peux juste mettre un flag qui dira si ta ressource est busy ou pas (droit d'aller fouiller dedans ou pas) et tu te sers des NSDistNotifs pour changer le flag.

    Ca n'empêche pas que gaffe au deadlocks, quoique c'est moins violent dans ce cas.
    Mais pense par exemple que tu es dans une section critique où il ne faut pas que l'appli 1 plante car sinon l'appli 2 sera interdite de consultation de la ressource (flag levé, jeton pris) mais ne récupèrera jamais le droit de la relire (jeton jamais rendu) car l'appli 1 aura planté entre temps.
    Ou alors tu fais un système de vérification, genre si le jeton est pris et que ça fait plus de 30s qu'il n'a pas été rendu, tu envois depuis l'appli 2 une NSDistNotif à  l'appli 1 pour qu'elle confirme qu'elle est encore vivante, et si elle ne répond pas tu reprends le jeton toi même.
  • wiskywisky Membre
    09:23 modifié #7
    ça marche nikel, si l'appli visible plante l'appli caché reprend automatiquement l'activité.
    En fait quand je le désactive il vérifié toute les 5 secondes si l'application visible est toujours lancé.
    J'obtient la liste des applications lancer grâce à  : [tt][[NSWorkspace sharedWorkspace] launchedApplications][/tt]

    <3 <3 <3 <3 <3 <3 <3 <3
Connectez-vous ou Inscrivez-vous pour répondre.