Plantage

tabliertablier Membre
16:26 modifié dans API AppKit #1
J'ai du faire une c....rie car ça plante. Ca plante sur la ligne: "resultat =" et franchement je ne vois pas pourquoi!
quelqu'un peut-il m'aider?

- (IBAction)a_lire:(id)sender<br />{<br />NSTask&nbsp;  *tache ;<br />NSPipe&nbsp; &nbsp; *pope ;<br />NSFileHandle&nbsp;  *poing ;<br />NSString&nbsp;  *nibOri, *tmp0, *strOri, *resultat ;<br /><br />	nibOri = [NSApp prise_Dossier:@&quot;fichier nib original ?&quot; :NO :YES :[NSArray arrayWithObject:@&quot;nib&quot;] ] ;&nbsp; &nbsp; // sélection du .nib<br />	if ([nibOri length] == 0) return ;<br />	tmp0 = [[nibOri lastPathComponent] stringByDeletingPathExtension] ;<br />	strOri = [NSApp nouveau_Fichier:tmp0 :@&quot;fichier strings?&quot; :YES :[NSArray arrayWithObject:@&quot;strings&quot;] ] ;&nbsp; &nbsp; // choix du fichier de sortie<br />	if ([nibOri length] == 0) return ;<br /><br />	tache = [[NSTask alloc] init] ;		&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // initialise<br />	pope = [[NSPipe alloc] init] ;	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // initialise<br />	[tache setLaunchPath:ibnibtool];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ibnibtool = /Developer/usr/bin/nibtool<br />	[tache setArguments:[NSArray arrayWithObjects:@&quot;-L&quot;, nibOri, nil] ];&nbsp;  //&nbsp; -L nomdu.nib<br />	[tache setStandardOutput:pope];			&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; Sortie sur un pipe<br />	poing = [pope fileHandleForReading];		&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // récupère le filehandle<br />	[tache launch];<br />	<br />	resultat = [[NSString alloc] initWithData:[poing readDataToEndOfFile] encoding:NSUnicodeStringEncoding] ; // plantage ici!<br /><br />	[pope release] ;<br />	[tache release];<br />	[resultat release] ;<br />}

Réponses

  • AliGatorAliGator Membre, Modérateur
    avril 2008 modifié #2
    A mon avis c'est parce que tu lis trop vite la NSPipe de sortie. Tu la lis à  peine après avoir lancé ta NSTask qui n'a à  peine le temps la pauvre d'écrire dedans. Enfin j'imagine.

    Le plus simple pour valider ça c'est soit d'attendre la fin de ta NSTask avant de faire qqch de ta NSPipe de sortie, soit de cumuler la sortie via une boucle while :
    NSData* inData;<br />NSMutableString* resultBuf = [[NSMutableString alloc] init];<br />...<br />  [tache launch];<br />  // et là  tu fais une boucle plutôt que de tout lire d&#39;un coup<br />  while ((inData = [poing availableData]) &amp;&amp; [inData length]) {<br />    [resultBuf appendString:[NSString stringWithData:inData]];<br />  }<br />  resultat = [resultBuf copy]; // juste pour faire propre, pour transformer la Mutable en Immutable<br />  [resultBuf release];<br /><br />  [pope release];<br />
    
    Bon honnêtement je vois pas non plus ce qui t'empêcherai de tout lire d'un coup non plus mais bon. C'est à  tenter.
  • tabliertablier Membre
    16:26 modifié #3
    Ok, je vois l'idée et je vais essayer.
  • tabliertablier Membre
    16:26 modifié #4
    Après avoir lu différents topic sur le sujet, j'ai fait 5 ou 6 essais qui se sont tous soldés soit par un crash, soit par une absence de fonctionnement.
    J'abandonne!!!
    J'ai réalisé ma fonction en applescript (do shell script "commande") et en 10 minutes ça a marché. cela m'a permis de voir que le code en Obj-C avec (NSTask) est trop rapide et ce termine avant que l'application UNIX soit lancée.
  • AliGatorAliGator Membre, Modérateur
    16:26 modifié #5
    même avec un [tt][tache waitUntilExit];[/tt] ?
  • tabliertablier Membre
    16:26 modifié #6
    Tout à  fait. ça a planté magnifiquement. J'ai alors essayé de controler avec une boucle qui utilise [tache isRunning]:  même punition.  Le plus fort c'est que si je supprime le pipe, le résultat s'imprime parfaitement sur la console!
Connectez-vous ou Inscrivez-vous pour répondre.