Communication entre application [Résolu]
wisky
Membre
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"?
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"?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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)
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
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.
Puis envoyer un SIGINT pour stopper, et un SIGCONT pour relancer
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.
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]