Comment tuer un NSThread ?

aranaudaranaud Membre
avril 2005 modifié dans API AppKit #1
Dans mon application, j'utilise un NSThread principale plus NSThread pour rafraà®chir un graphique avec normalement une seule courbe à  la fois.

Or, il se trouve que dans certaine situation, je me retrouve avec deux courbes.

Donc, je voudrait mettre fin au calcule avant de relancer le calcul d'un nouveau graphique en mettant fin au NSThread du calcule précédant.

[Fichier joint supprimé par l'administrateur]

Réponses

  • fouffouf Membre
    19:46 modifié #2
    On ne peut pas "killer" un thread comme ca. J'imagine que tu utilises detachNewThreadSelector:toTarget:withObject: . Le plus simple serait donc d'avoir 2 booléens un qui dirait si oui ou non le thread de dessin est déjà  lancé, un autre qui servirait de signal à  la fin du thread de dessin. On aurait donc un truc de ce genre la :
    <br />- (void)tuerLeThreadDessin<br />{<br />&nbsp;  tuerLeThread = YES;<br />}<br /><br />- (void)actionQuiLanceLeDessin<br />{<br />&nbsp;  // le blabla d&#39;avant<br /><br />[self tuerLeThreadDessin];<br />while(leThreadFonctionne){//attendre};<br /><br />[self relancerLeThread]<br /><br />//le blabla d&#39;apres<br />}<br /><br />- (void)relancerLeThread<br />{<br />// lancer le thread<br />leThreadFonctionne = YES;<br />}
    


    Et voici le code du thread de dessin

    <br />-(void)dessiner<br />{<br />//ben, ya du code et puis à  un moment dans une boucle, insérer<br />if(tuerLeThread) return; // on tue le thread<br />}
    


    Voila, si tu as besoin d'explications, ...

    PS:
    Comment tué un NSThread ?

    Si Chacha voit ca, il va piquer une colère  ;)
  • aranaudaranaud Membre
    19:46 modifié #3
    dans 1112454189:

    On ne peut pas "killer" un thread comme ca.


    C'est dommage.

    J'ai essayé mais aucun changement. :'(

    Mais j'ai plus l'impression que le problème vient au moment du rafraà®chissement de l'interface. J'utilise cette méthode pour lancer la mise à  jours de l'interface.

    <br />- (void)setNeedsDisplay:(BOOL)flag<br />
    


    Nota : j'utilise la framework GraphTool

    dans 1112454189:

    PS:
    Comment tué un NSThread ?

    Si Chacha voit ca, il va piquer une colère  ;)


    Euh, pourquoi ? 
  • fouffouf Membre
    19:46 modifié #4
    D'après ce que je vois, tu utilises GraphTool. C'est bien ca ? Si oui, n'oublie pas d'effacer puis de recréer la courbe.

    dans 1112457001:

    Euh, pourquoi ? 

    Il faut mettre Comment tuer un NSThread ?  :o
  • aranaudaranaud Membre
    19:46 modifié #5
    dans 1112457322:

    Il faut mettre Comment tuer un NSThread ?  :o


    Corriger.

    dans 1112457322:

    D'après ce que je vois, tu utilises GraphTool. C'est bien ca ? Si oui, n'oublie pas d'effacer puis de recréer la courbe.


    <br />- (void)dessineGraphique:(id)sender <br />{<br />    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br />    [graph supprimerCourbe:@&quot;Graph&quot;];           // efface courbe<br />    if (sender != nil) {<br />        operationGraph = [[objectListe_operation alloc] initWithContent:[[self document] partieListeOperation]];<br />        [operationGraph setCalculeValide:YES];                                                                  // pour valider la calcule<br />        if ([operationGraph creationGraphique:graph search:sender]) { } else [graph supprimerCourbe:@&quot;Graph&quot;];  // efface courbe<br />        [operationGraph release];<br />    }<br />    [graph setNeedsDisplay:YES];                // mise à  jours de l&#39;interface<br />    operationGraph = nil;                       // pour indiquer que le NSThread est finie<br />    [pool release];<br />    [NSThread exit];<br />}<br />
    


    Le problème ne se pose que si la courbe n'a que deux points.
  • fouffouf Membre
    19:46 modifié #6
    Je ne sais pas si ca peut jouer mais si tu lance le thread avec detach..., tu n'as pas besoin de faire un [NSThread exit]; : le thread se ferme tout seul quand la fonction est finie.
  • aranaudaranaud Membre
    19:46 modifié #7
    Sa ne change rien. Mais tu as raison [NSThread exit] ne sert à  rien.
  • aranaudaranaud Membre
    19:46 modifié #8
    J'ai fini par trouver.

    <br />- (void)dessineGraphique:(id)sender <br />{<br />    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br />    [graph supprimerCourbe:@&quot;Graph&quot;];           // efface courbe<br />    [graph setNeedsDisplay:YES];                // mise à  jours de l&#39;interface<br />    while ([graph needsDisplay]) { }            // attente fin de mise à  jours de l&#39;interface<br />    if (sender != nil) if ([operationGraph creationGraphique:graph search:sender]) { } else [graph supprimerCourbe:@&quot;Graph&quot;];   // efface courbe<br />    [graph setNeedsDisplay:YES];                // mise à  jours de l&#39;interface<br />    [pool release];<br />}<br />
    


    Il me semble que la méthode setNeedsDisplay crée son propos NSThread pour dessiner l'interface. Donc, en la couplant avec ton idée, plus de problème.  :adios!:
Connectez-vous ou Inscrivez-vous pour répondre.