2010-07-26 12 views
0

J'ai un problème avec mon code. Je veux lancer le thread mais quand il est lancé, il ne peut pas démarrer une isthme NSTimer. Pouvez-vous m'aider?Problème avec Thread et NSTimer

-(void)detectionMove:(NSTimer*)timer{ 

    int indexArray = [[[timer userInfo] objectForKey:@"arrayIndex"] intValue]; 
    // do something 
} 



-(void)callDectectionMove:(NSNumber*)arrayIndex{ 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init]; 
    [myDictionary setObject:arrayIndex forKey:@"arrayIndex"]; 

    //This istruction can't lunch a detectionMove method 
    [NSTimer scheduledTimerWithTimeInterval:timeToCatch target:self selector:@selector(detectionMove:) userInfo:myDictionary repeats:NO]; 

    [pool release]; 

} 


-(void)detectPositionMovement{ 


    for(int i = 0; i< [self.arrayMovement count]; i++){ 

     if((actualAccelerometerX+sensibilityMovement) > [[[[self.arrayMovement  objectAtIndex:i] arrayPositionMove]objectAtIndex:0] valueX] && (actualAccelerometerX-sensibilityMovement) < [[[[self.arrayMovement  objectAtIndex:i] arrayPositionMove]objectAtIndex:0] valueX] && 
      (actualAccelerometerY+sensibilityMovement) > [[[[self.arrayMovement  objectAtIndex:i] arrayPositionMove]objectAtIndex:0] valueY] && (actualAccelerometerY-sensibilityMovement) < [[[[self.arrayMovement  objectAtIndex:i] arrayPositionMove]objectAtIndex:0] valueY] && 
      (actualAccelerometerZ+sensibilityMovement) > [[[[self.arrayMovement  objectAtIndex:i] arrayPositionMove]objectAtIndex:0] valueZ] && (actualAccelerometerZ-sensibilityMovement) < [[[[self.arrayMovement  objectAtIndex:i] arrayPositionMove]objectAtIndex:0] valueZ]) 
      [NSThread detachNewThreadSelector:@selector(callDectectionMove:) toTarget:self withObject:[NSNumber numberWithInt:(int)i]]; 

     } 
} 

Répondre

0

Vous créez NSTimer la menace et de l'objet minuterie est ajouté à la piscine (car il est méthode de classe), donc avant votre minuterie est s'appelle l'objet de la minuterie sera libéré (puisque le contexte de fil sera terminée avant le minuteur est déclenché).

Il existe 2 solution 1. Ajoutez un nombre de rétention à l'objet NSTimer et relâchez une fois que vous avez terminé le travail du minuteur. 2. Assurez-vous que votre thread n'est pas sorti jusqu'à ce que le minuteur ait terminé son travail.

+0

Pas tout à fait correct. Un temporisateur planifié est implicitement conservé. Il n'y a pas besoin de le retenir. Votre deuxième pensée peut-être bien dur. – tonklon

+0

c'est l'objet de concept est ajouté au pool de version automatique actuel avant que l'objet soit renvoyé à partir de la méthode de classe. Dans votre cas, l'objet 'pool' est le pool de publication automatique en cours qui est libéré avant la fermeture du thread. donc quand 'pool' est libéré tout l'objet à l'intérieur recevra le message de libération - ainsi pour conserver l'objet vous devriez augmenter le compte de retenue par 1. –

+0

J'ai fait une étude de détail en utilisant un programme d'exemple, quelques observations 1. Minuterie tirer sur la même boucle de lancement où il a créé, chaque thread a sa propre boucle d'exécution de sorte que votre thread doit être en cours d'exécution pour que votre minuteur se déclenche le temps que vous avez mentionné. 2. scheduledTimerWithTimeInterval Renvoie l'objet NSTimer avec un nombre de retenues égal à '2', de sorte qu'un seul compte soit réduit lorsque le pool de libération automatique est libéré et le second sera réduit une fois que l'événement de temporisation est déclenché. –

1

Avez-vous vraiment, vraiment besoin d'un fil différent? Vous voulez démarrer une minuterie sur ce fond Thread, pourquoi ne pouvez-vous pas démarrer le minuteur sur le thread principal?

Pour répondre à votre question: Le premier problème est: Votre fil de discussion ne fonctionne pas assez longtemps comme suggéré par Girish.

Le deuxième problème est le suivant: Vous ne bouclez pas la boucle de lancement du thread. Un runloop est nécessaire pour qu'une minuterie fonctionne.

Voir aussi:

Running NSTimer Within an NSThread?

Threaded NSTimer

1

Juste résolu! La clé commence la minuterie dans le thread principal

[self performSelectorOnMainThread:@selector(startTimer) withObject:nil waitUntilDone:FALSE]; 

Hope this hepls