NSThread et performSelector:withObject:afterDelay:

21:31 modifié dans API AppKit #1
bonjour !

j'ai un petit problème qui va vous sembler bien basique, mais je ne sais pas comment m'en sortir  :P

Voilà  donc mettons par exemple dans ma méthode init :

[NSThread detachNewThreadSelector:@selector(truc) toTarget:self withObject:nil];


dans ma méthode -(void)truc  :
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];<br />[self performSelector:@selector(truc2) withObject:nil afterDelay:3];<br />[pool release];


et évidement le performSelector n'est jamais appelé parce que le thread quitte avant je suppose... Mais alors comment faire ? (pitié pas des NSTimer j'en sors c'est la galère parce que j'ai besoin de l'arrêter et de le relancer tout le temps, et y'en a plein :P)
Merci de votre aide en tout cas :)

Réponses

  • 21:31 modifié #2
    Déjà  ta méthode truc doit prendre un argument (même si tu lui attribues nil). Essaie donc de remplacer -(void)truc par -(void)truc:(id)obj et @selector(truc) par @selector(truc:).
  • 21:31 modifié #3
    merci, j'ai modifié comme tu me l'as dit.
    Mais ça ne marche pas mieux :p.....
  • 21:31 modifié #4
    En fait un truc m'avait échappé dans ton code. Le fait que tu fais appel à  self dans le thread détaché pourrait causer un problème (suis pas spécialiste en multithreads). Mais si l'exemple que tu donnes est ce que tu as dans ton code (et pas un code simplifié), tu peux tout faire dans le thread principal.

    Peut être que d'autres pourraient t'aider.
  • 21:31 modifié #5
    ah bon on peut pas faire de multithread dans la même classe ?? ???
    C'est effectivement un code simplifié ;), j'ai écrit ce code dans un petit projet de test pour être sûr que ça ne marche pas... :P

    Personne n'a d'idée ?  :(
  • 21:31 modifié #6
    Si on peut, mais certaines opérations sont "threadsafe" et d'autres ne le sont pas. Ce que j'ai fait dans une de mes apps est en fait de passer par le threadDictionary (qui est thread-safe), sinon ça cause parfois des problèmes à  un endroit ou à  une autre.
  • 21:31 modifié #7
    oki merci de ces précisions ;)

    Ceci dit dans mon cas ça devrait marcher, et puis c'est vraiment le fait que ce soit dans un NSThread qui pose problème, dès que tout se fait dans le thread principal tout marche...
    Et si je fais un simple performSelector:withObject: ça marche aussi... C'est le withDelay qui ne lui plaà®t pas :( :(
  • mpergandmpergand Membre
    21:31 modifié #8
    dans 1113807984:


    -(void)truc  :
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];<br />[self performSelector:@selector(truc2) withObject:nil afterDelay:3];<br />[pool release];
    


    et évidement le performSelector n'est jamais appelé parce que le thread quitte avant je suppose... Mais alors comment faire ? (pitié pas des NSTimer j'en sors c'est la galère parce que j'ai besoin de l'arrêter et de le relancer tout le temps, et y'en a plein :P)
    Merci de votre aide en tout cas :)


    Essaye en ajoutant:
    [[NSRunLoop currentRunLoop] run];

  • 21:31 modifié #9
    est-il nécessaire de préciser qu'une fois de plus tes conseils se sont avérés tout à  fait pertinents ? ;)

    Merci beaucoup mpergand, ca marche nickel ;);) j'ai plus qu'à  m'en servir dans mon application en espérant que ça marche aussi facilement :D
Connectez-vous ou Inscrivez-vous pour répondre.