Timers gourmands.

muqaddarmuqaddar Administrateur
février 2005 modifié dans API AppKit #1
J'utilise 2 timers dans mon appli qui vérifient un truc toutes les 10 secondes et un autre qui crée un affichage à  25i/s...

J'ai l'impression qu'au moment où ils se déclenchent tous les X secondes, ça fait ramer un peu mon appli graphiquement.
C'est normal ? C'est gourmand un timer par défaut ?  :o

J'ajoute que pour  l'affichage à  25i/s, j'ai mis toutes les images en cache pour éviter les accès disque, et que ça n'a rien changé.
«1

Réponses

  • ClicCoolClicCool Membre
    18:48 modifié #2
    dans 1109583906:

    C'est gourmand un timer par défaut ?  :o


    Je crois pas, c'est juste une condition ajoutée dans le run-loop
    Et puis si c'était le timer lui même qui te ralentissait, ça ralentirait l'appli globalement à  chaque tour du runLoop et pas juste quand il se déclenche.

    dans 1109583906:

    J'ajoute que pour  l'affichage à  25i/s, j'ai mis toutes les images en cache pour éviter les accès disque, et que ça n'a rien changé.


    J'ai l'impression que c'est quand même l'appel de ta méthode qui ralenti ton soft.
  • muqaddarmuqaddar Administrateur
    18:48 modifié #3
    Oui, tu as raison, ma méthode n'est pas optimisée en plus elle appelle un applescript... ça doit être ça.
  • ClicCoolClicCool Membre
    18:48 modifié #4
    dans 1109584846:

    Oui, tu as raison, ma méthode n'est pas optimisée en plus elle appelle un applescript... ça doit être ça.


    Je crois que t'appèle AS avec NSAS auquel tu transmet le fichier texte de ton script non ?

    T'aurait pas moyen d'utiliser à  la place un script (ou des portions de script) compilé ?
  • muqaddarmuqaddar Administrateur
    18:48 modifié #5
    Je vosi ce que tu veux dire mais comment faire cela ?
    J'avais essayé d'appeler des .script mais ça marchait pas.

    Si tu as des pistes...
  • ClicCoolClicCool Membre
    18:48 modifié #6
    Tu compile ton script comme une appli et tu le lance avec une NSTask ...
    Récupères les éventuels résultats avec un NSPipe etc ... non ?
  • muqaddarmuqaddar Administrateur
    18:48 modifié #7
    Jamais fait... mais c'est l'occasion.
  • fouffouf Membre
    18:48 modifié #8
    T'inquiete, je suis devenu expert en ce qui concerne les NSTask et NSPipe. Si tu as besoin d'aide, je suis la.  ;)
  • muqaddarmuqaddar Administrateur
    18:48 modifié #9
    Cool. Merci fouf.
    [tt]
    NSTask *maTask;
    [maTask setLaunchPath:NSBundle mainBundle] pathForResource:@"CountApp" ofType:@"scpt";
    [maTask setArguments:[NSArray arrayWithObjects:@";",nil]];
    [maTask launch];
    [/tt]

    J'ai commencé comme ça, maintenant je vais regarder du côté de NSPipe car je dois récupérer le résultat de mon AS.
  • muqaddarmuqaddar Administrateur
    février 2005 modifié #10
    Apparemment va falloir utiliser :

    - (NSFileHandle *)fileHandleForWriting

    Y'a personne qu'à  un exemple sous la main ?

    J'ai rien trouvé dans les exemples des developpers tools. :(
  • muqaddarmuqaddar Administrateur
    18:48 modifié #11
    A l'aide !  :why?: :why?: :why?:
    Je suis à  la rue.

    Comment je récupère un bête "return toto" dans un fichier compilé AppleScript .script depuis un NSTask et NSPipe ?  o:) :'(
  • fouffouf Membre
    18:48 modifié #12
    Voila un exemple d'executable, lance par mon appli, qui ecrit une expression et qui recoit un nombre.
    Il faut que tu regarde ds le fichier OCPGraphique, les methodes -init -sendData et -gotData: . Normalement, il ya les reponses a toutes tes questions. Si t'as probleme, appelle moi.  ;)
  • muqaddarmuqaddar Administrateur
    18:48 modifié #13
    Il est où ton prog ? ;)
  • fouffouf Membre
    18:48 modifié #14
    Pardon, j'était un peu a la bourre quand je postait. Le voila.

    [Fichier joint supprimé par l'administrateur]
  • muqaddarmuqaddar Administrateur
    18:48 modifié #15
    Merci pour ton appli.

    Je voulais savoir, j'ai besoin du fileHandleForReading ou fileHandleForWrinting pour récupérer le texte de retour de mon applescript ?

    Je pige pas trop la doc Apple de ce côté là ...
  • fouffouf Membre
    mars 2005 modifié #16
    Je crois que quelqu'un a déjà  posé la question ya pas longtemps sur le forum. Je regarde.

    [edit]
    Voilan http://www.objective-cocoa.org/forum/index.php?topic=277.0.
    Dis, t'as pas déjà  posé la question ??  ;)
  • muqaddarmuqaddar Administrateur
    18:48 modifié #17
    Euh ?
    C'est quoi le rapport avec ma question précédente sur fileHandle fouf ? :)
  • fouffouf Membre
    18:48 modifié #18
    Bon, je me suis gouré : j'ai oubliéce que tu avais demandé avant.

    Tu crés un NSPipe vers la NSTask :
    NSPipe *fromPipe = [NSPipe pipe];
    

    tu utilise fileHandleForReading pour récupérer le NSFileHandle correspondant a la lecture
    NSFileHandle *fromEvaluator = [fromPipe fileHandleForReading];
    

    et tu t'enregistre comme observateur pour la notif NSFileHandleReadCompletionNotification
    [ [NSNotificationCenter defaultCenter]<br />            addObserver:self<br />               selector:@selector(gotData:)<br />                   name:NSFileHandleReadCompletionNotification<br />                 object:fromEvaluator ];
    


    Enfin, tu implémente la méthode gotData: en fonction du type de retour de ton executable auxiliaire.

    J'ai répondu à  la question ?
  • muqaddarmuqaddar Administrateur
    18:48 modifié #19
    Oui, parfaitement.

    Quand je lance l'appli, je me retrouve avec avec SIGTRAP à  cause de la ligne du setLaunchPath.

       NSPipe       *fromPipe;<br />    NSFileHandle *fromEvaluator;<br />	NSTask *evaluator;<br />	<br />	fromPipe = [NSPipe pipe];<br />	fromEvaluator = [fromPipe fileHandleForReading];<br />		<br />	evaluator = [[NSTask alloc] init];<br />	[evaluator setLaunchPath:[[NSBundle mainBundle] pathForResource:@&quot;myScript&quot; ofType:@&quot;scpt&quot;]];<br />	<br />	[evaluator setStandardOutput:fromPipe];<br />	[evaluator launch];<br />		<br />	[[NSNotificationCenter defaultCenter]<br />            addObserver:self<br />               selector:@selector(getData:)<br />                   name:NSFileHandleReadCompletionNotification<br />                 object:fromEvaluator ];<br />
    


    T'as uen idée ?
  • ClicCoolClicCool Membre
    18:48 modifié #20
    dans 1109692066:

    Oui, parfaitement.

    Quand je lance l'appli, je me retrouve avec avec SIGTRAP à  cause de la ligne du setLaunchPath.

    &nbsp;  NSPipe&nbsp; &nbsp; &nbsp;  *fromPipe;<br /> 	[evaluator setLaunchPath:[[NSBundle mainBundle] pathForResource:@&quot;myScript&quot; ofType:@&quot;scpt&quot;]];<br /><br />
    



    Tu veux pas écrire ça sur 2 lignes, juste pour voir si ton path est bon ?

    &nbsp; NSString*&nbsp; path = [[NSBundle mainBundle] pathForResource:@&quot;myScript&quot; ofType:@&quot;scpt&quot;];<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;le path: %@&quot;, path);<br /> 	[evaluator setLaunchPath:path];<br />
    

    on sait jamais ;)
  • muqaddarmuqaddar Administrateur
    mars 2005 modifié #21
    Il me renvoie ça :
    path : /Users/oxitan/Cocoa/Exemples/animateAlphaProject2/build/alphaProject.app/Contents/Resources/monScript.scpt

    donc le path est bon. :(

    Mais je n'ai pas de setArguments en revanche (qui prend un array).
    Y'en a besoin ds mon cas ?

    Sinon il em dit ça : <NSInvalidArgumentException> launch path not accessible

    ?
  • fouffouf Membre
    18:48 modifié #22
    Je pense avoir une idée : ton AS n'est pas executable au sens UNIX du terme : dans les autorisations ne sont pas bonnes.
    Il faut que tu ailles dans le dossier de ton AS et que tu tapes la commande ls -al monScript.scpt
    normalement les autorisations doivent etre un truc du genre :
    -r/x////// ou les / sont des valeurs qui ne sont pas intéréssantes pour ton cas.

    Il est aussi possible que ton AS ne soit pas enregistré sous le format Application et c'est pour ca qu'il ne peut pas l'atteindre.

    dans 1109699449:

    Mais je n'ai pas de setArguments en revanche (qui prend un array).
    Y'en a besoin ds mon cas ?

    Non, c'est une application par un truc a ligne de commande.

    Bon courage.
  • ClicCoolClicCool Membre
    18:48 modifié #23
    dans 1109699449:

    Sinon il em dit ça : <NSInvalidArgumentException> launch path not accessible

    ?


    Essaies donc de sortir ton script du bundle.
    T'as peut-être un problème d'autorisation d'accès.
    Ton Bindle appartient à  ton appli qui tourne déjà  ...

    [grilled] par le chevelu. On m'avait pourtant dit que La valeur n'attend pas la longueur de cheveux !
  • muqaddarmuqaddar Administrateur
    18:48 modifié #24
    Je l'ai passé en .app (il était en .scpt avant) et j'ai le path à  (null) maintenant !
    J'ai mis les droits au max en plus... :(
  • muqaddarmuqaddar Administrateur
    18:48 modifié #25
    C'est bon.
    Un executable .app ajouté ds le bundle avec les droits nornaux.
    Le dernier je l'avais pas ajouté ds xcode...

    Merci à  vous ! je vais continuer.
  • muqaddarmuqaddar Administrateur
    18:48 modifié #26
    Hélas, ma méthode getData n'est pas appelée :(
    (j'ai mis un NSLog dedans)

    Voilà  mon code :

        NSPipe       *fromPipe;<br />    NSFileHandle *fromTask;<br />	NSTask *task;<br />	NSString* path = [[NSBundle mainBundle] pathForResource:@&quot;myScript&quot; ofType:@&quot;app&quot;];<br />	<br />	fromPipe = [NSPipe pipe];<br />	fromTask = [fromPipe fileHandleForReading];<br />		<br />	task = [[NSTask alloc] init];<br />	<br />	[task setLaunchPath:path];	<br />	[task setStandardOutput:fromPipe];<br />	[task launch];<br />		<br />	[[NSNotificationCenter defaultCenter] addObserver:self<br />											 selector:@selector(getData:)<br />												 name:NSFileHandleReadCompletionNotification<br />											   object:fromTask];<br />	[task release];
    


    Vs avez une idée ?
  • cbrandtcbrandt Membre
    18:48 modifié #27
    et en intervertissant launch et addObserver ?
    par ailleurs, faire un release sur tache alors qu'elle n'est peut-être pas terminée...
  • ClicCoolClicCool Membre
    18:48 modifié #28
    dans 1109710172:
    faire un release sur tache alors qu'elle n'est peut-être pas terminée...


    ah oui tiens, une piste possible ça.
  • fouffouf Membre
    18:48 modifié #29
    Dans mon code, il ya gotData: et pas getData:
  • ClicCoolClicCool Membre
    18:48 modifié #30
    dans 1109711248:

    Dans mon code, il ya gotData: et pas getData:


    Ah ? une faute de typo sur un code copié/coller ... c'est pas rare ça non plus.
    Mais le compilo aurait alors dû te le dire. ??
  • cbrandtcbrandt Membre
    18:48 modifié #31
    pas si on utilise @selector(xxx:)...
Connectez-vous ou Inscrivez-vous pour répondre.