2010-07-27 4 views
1

J'ai un problème avec mon code Je veux créer 2 instances différentes avec NSThread mais je pense que dans mon problème cela ne se produit pas. Pouvez-vous prendre ma une solution à mon problème. Je poste mon code, si vous le pouvez vous pouvez montrer un exemple de solution? MerciProblème avec NSThread

@implementation myClass 


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

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

    identificationMove *identifier = [[identificationMove alloc]init]; 
    [identifier setArrayIndex:(NSNumber*)arrayIndex]; 
    [identifier detectionMove]; 

    [identifier release]; 

} 


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

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

    [self performSelectorOnMainThread:@selector(detectMove:) withObject:(NSNumber*)arrayIndex waitUntilDone: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]) 

        //I'm not sure that these istruction can start a 2 different and indipendent thread 
      [NSThread detachNewThreadSelector:@selector(callDectectionMove:) toTarget:self withObject:[NSNumber numberWithInt:(int)i]]; 

     } 
} 

@end 
+0

Vous n'avez pas mentionné le problème. Avez-vous des avertissements/accidents/les choses ne sont pas exécutées? Quel est le problème? En outre, je ne comprends pas pourquoi exécutez le 'callDectectionMove' dans un fil séparé quand tout ce que vous avez dans cette méthode est l'exécution d'une autre méthode dans le thread principal ... –

+0

je n'ai pas de crash et similaire mais quand le si est vrai pour 2 fois, le programme ne peut pas déjeuner 2 threads différents. Je fais cette structure car je veux reconnaître un mouvement d'accéléromètre et je dois avoir 2 fils différents pour 2 mouvements différents 3 pour 3 .... ok? – zp26

Répondre

2

Dans votre code [nombre self.arrayMovement] nombre de threads seront créés, mais ils courront dans un ordre séquentiel puisque tous les fils veulent exécuter la fonction « detectMove » dans thread principal.

Lorsque vous exécutez la déclaration suivante:

[self performSelectorOnMainThread:@selector(detectMove:) withObject:(NSNumber*)arrayIndex waitUntilDone:NO]; 

-> faire méthode « detectMove » à exécuter en fil principal, un thread peut exécuter une seule instruction à la fois, à cause de cela, vous verrez une séquence opération de votre implémentation de thread.

0

Finalement, la méthode detectMove est exécutée dans le thread principal.
Je crois que detectPositionMovement est également exécuté à partir du thread principal.
L'exécution de tout detectMove ne commencera pas tant que le detectPositionMovement ne sera pas terminé.

Essayez d'appeler detectMove directement à partir de detectPositionMovement (sans callDectectionMove et sans performSelectorOnMainThread).

0

Placez le point de rupture dans la detectPositionMovement et vérifiez combien de fois cette ligne est en cours d'exécution:

[NSThread detachNewThreadSelector:@selector(callDectectionMove:) toTarget:self withObject:[NSNumber numberWithInt:(int)i]]; 

si elle est en cours d'exécution 2 fois puis deux fils sont en cours d'expédition. sinon, il vérifie les conditions du bloc "if".

+0

à mon avis le problème est le "[self performSelectorOnMainThread: @selector (detectMove :) avecObject: (NSNumber *) arrayIndex waitUntilDone: NO];" parce que la première istruction a été exécutée 2 fois mais le execSelectorOnMainThread non parce que est exclusif. Mon problème est ici. – zp26

+0

voulez-vous exécuter votre méthode detectMove dans deux threads différents? Si oui, vous ne devriez pas l'exécuter sur le fil principal. Car même si vous créez des threads mais que vous utilisez la méthode callDetectionMove, vous exécutez le code sur le thread principal. Donc finalement l'exécution se passe sur le thread principal. – Ideveloper

+0

oui, mais pour mon programme est nécessaire que les threads sont exécutés pour le premier (sans performSelectorOnMainThread mon programme ne peut pas les exécuter). Et c'est un gros problème. – zp26