deamon en Objective-C, c'est possible ?

odjauodjau Membre
16:36 modifié dans API AppKit #1
Salut tout le monde,
Ma question est peut-être un peu tordu, mais bon, je vais essayer d'être claire (et sans faire trop de fautes d'orthographes  >:) )

J'ai une petite appli obj-c/cocoa qui affiche un NSStatusItem (une image) dans la NSSTatusBar (à  droite de la barre de menu). Je fais varier cette image en fonction d'un popUp. Tous ce petit monde fonctionne  :).

Mon problème c'est que j'aimerai faire apparaitre et commander le changement d'item à  partir d'une autre appli développée en... LabVIEW.
En LabVIEW le seul moyen à  ma conaissance pour communiquer avec une autre appli est d'utiliser l'équivalant d'une ligne de commande.

Ma question est donc la suivante, est-il possible à  partir de ma petite appli de faire un deamon (je ne suis pas convaincu que le terme soit approprié  ???) qui serait :
- "launchable"/"stoppable" par ligne de commande
- "commandable" (changement de l'item) toujours par ligne de commande
- et invisible dans le dock

J'espère avoir été claire, et que vous aurez une ou deux pistes à  me proposer  :P

Ciao

Réponses

  • wiskywisky Membre
    16:36 modifié #2
    ça tombe bien je cherche à  savoir la même chose. D'après ce que j'ai trouvé il faut le faire en C ou C++ :-\\
  • odjauodjau Membre
    16:36 modifié #3
    dans 1123765296:

    D'après ce que j'ai trouvé il faut le faire en C ou C++ :-\\


    ça c'est pas glop  :(
    mais, je ne veux pas renoncer trop vite, je vais chercher d'autre piste  >:) et peut être que quelqu'un aura une bonne idée  ::)
  • BruBru Membre
    16:36 modifié #4
    Il est tout à  fait possible de créer des "daemons" (même si en fait ce ne sont pas des daemons au sens unix du terme) en objective-c/cocoa.

    1- on peut facilement créer (sous xcode) un projet pour faire un "outil" en objective-c/cocoa. Cet outil n'aura pas d'ui (donc pas d'utilisation du AppKit), mais peut être manipuler en ligne de commande.

    2- on peut créer une appli objective-c/cocoa qui n'aura pas d'ui visible (donc pas dans le dock) en manipulant les clés LSUIPresentationMode ou LSBackgroundOnly du Info.plist de l'appli.

    doc sur LSBackgroundOnly.
    doc sur LSUIPresentationMode.

    .
  • odjauodjau Membre
    16:36 modifié #5
    dans 1123767969:

    1- on peut facilement créer (sous xcode) un projet pour faire un "outil" en objective-c/cocoa. Cet outil n'aura pas d'ui (donc pas d'utilisation du AppKit)


    Donc je serais dans l'impossibilité d'utiliser NSStatusBarItem ???
  • BruBru Membre
    16:36 modifié #6
    dans 1123768422:

    dans 1123767969:

    1- on peut facilement créer (sous xcode) un projet pour faire un "outil" en objective-c/cocoa. Cet outil n'aura pas d'ui (donc pas d'utilisation du AppKit)

    Donc je serais dans l'impossibilité d'utiliser NSStatusBarItem ???


    A mon avis, c'est la seconde option qui correspond le mieux à  ce que tu veux réaliser. Le Dock fonctionne de la même manière : une ui minimale, pas, pas de barre de menu, pas d'icône dans le Dock (lui même !!).

    .
  • odjauodjau Membre
    16:36 modifié #7
    OK pour l'otion 2, je viens de regarder la doc que tu m'as indiquée, ça me parait tout à  fait approprié.
    Mais comment je fait pour "piloter" mon appli ?

    En tous cas, merci pour les infos.
  • BruBru Membre
    16:36 modifié #8
    dans 1123768901:

    OK pour l'otion 2, je viens de regarder la doc que tu m'as indiquée, ça me parait tout à  fait approprié.


    En fait, je pense même que la clé LSUIElement est réellement ce qui te conviens, puisque ton appli semble bien être un "agent".

    dans 1123768901:

    Mais comment je fait pour "piloter" mon appli ?


    Qu'entends-tu par piloter ton appli ? Car je n'ai pas vraiment saisi ton speech du début concernant le fait d'être "commandable" par ligne de commande...

    .
  • odjauodjau Membre
    16:36 modifié #9
    dans 1123769269:

    Qu'entends-tu par piloter ton appli ? Car je n'ai pas vraiment saisi ton speech du début concernant le fait d'être "commandable" par ligne de commande...


    Actuellement mon appli posséde une action liée à  un NSPopUpButton.Suivant la valeur de ce dernier je change l'image de mon NSStatusItem.
    J'aimerais remplacer l'action sur le NSPopUpButton par une ligne de commande...
  • AntilogAntilog Membre
    16:36 modifié #10
    Si j'ai tout bien compris  :o

    Tu as déjà  répondu à  tout, Bru!

    Il faut faire une autre appli "outil" (proposition 1) qui sera lancée par ligne de commande, et qui communiquera ses résultats à  l'appli "agent" (proposition 2)
    <3
  • odjauodjau Membre
    16:36 modifié #11
    dans 1123770726:

    Il faut faire une autre appli "outil" (proposition 1) qui sera lancée par ligne de commande, et qui communiquera ses résultats à  l'appli "agent" (proposition 2)

    Ah non, la j'suis pas d'accord, parceque quand je vais rajouter ma couche LabVIEW, ça va me faire chaà®ner 3 Applis. Moi j'appel ça une usine à  gaz  ;D :fouf):
    Déjà  que c'est pas super clean comme méthode  :)
  • ChachaChacha Membre
    août 2005 modifié #12
    Si vous voulez, j'ai une solution pas trop compliquée qui mixe Unix et Cocoa.
    En Unix, la commande "tail" affiche la fin d'un fichier. Mais si on rajoute l'option -f, après l'affichage, le tail se bloque jusqu'à  ce qu'il y ait une nouvelle ligne à  afficher.
    Maintenant, imaginons que dans ce fichier, chaque ligne décrive le travail à  faire par ton appli. Et bien à  chaque fois que tu rajoutes une telle ligne dans le fichier, ton appli la récupère et peut l'interpréter.

    En mixant ça avec une NSTask et un NSPipe, tout va bien. J'ai testé, ça marche.

    <br />NSTask* task = [[NSTask alloc] init];<br />NSPipe* pipe = [NSPipe pipe];<br />[task setLaunchPath:@&quot;/usr/bin/tail&quot;]; //la task est &quot;tail&quot;<br />[task setArguments:[NSArray arrayWithObjects:@&quot;-f&quot;, @&quot;/Users/chacha/Desktop/pipe.dat&quot;, nil]];//on lui dit de surveiller le fichier /Users/chacha/pipe.dat<br /><br />[task setStandardOutput:pipe];//la sortie du tail est redirigée vers pipe<br />[task launch];//onlance le total<br />while(YES)//boucle infinie<br />{<br />  NSData* data = [[pipe fileHandleForReading] availableData];//ce code est bloquant quand aucune nouvelle donnée n&#39;est accessible<br /><br />  //qand on est débloqué, une nouvelle ligne a été ajoutée au fichier<br />  NSString* string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];//on récupère cette ligne sous forme de string<br />  NSLog(@&quot;string = %@&quot;, string);//libre à  toi de l&#39;interpréter, maintenant<br />}//et on recommence...<br />[task release];<br />
    


    L'avantage de cette technique, c'est que tu n'as pas besoin de faire plusieurs programmes, l'appli est son propre démon (le code précédent peut être mis dans un thread à  part)

    NB : pour tester, ne modifie pas le fichier "pipe.dat" avec TextEdit, car TextEdit, quand il sauvegarde, créer une copie du fichier et supprime l'ancien, donc ça ne marche pas. Pour tester, passe donc par la ligne de commande et fait des "echo "turlututu" >> pipe.dat"
    Si tu veux plus de détails Unixiens, je peux être plus disert, faut juste demander.

    +
    Chacha

    [edit]
    Dans ce cas, Labview doit simplement ajouter des lignes au fichier surveillé, pas besoin de lancer des commandes...
    [/edit]
  • odjauodjau Membre
    août 2005 modifié #13
    @ Chacha
    Je vais tester ça de ce pas. D'ailleurs j'allais justement regarder une solution de ce type, mais pas autant "unixienne".

    Merci

    PS : juste une question, la boucle infinie ça va pas me prendre 100% des resources de mon processeur par hasard ?

    [Edit] je viens de relire plus précisément ta solution, je crois j'ai dis une connerie dans mon PS  :o on oublie >:) [/edit]
  • ChachaChacha Membre
    16:36 modifié #14
    dans 1123771756:

    PS : juste une question, la boucle infinie ça va pas me prendre 100% des resources de mon processeur par hasard ?

    Non non, puisque l'appel à  "availableData" est bloquant. ça s'endort tant qu'il n'y a rien de nouveau...
  • odjauodjau Membre
    16:36 modifié #15
    Grillé  :crackboom:-
Connectez-vous ou Inscrivez-vous pour répondre.