2010-07-27 5 views
1

У меня проблема с моим кодом Я хочу создать 2 разных экземпляра с помощью NSThread, но я думаю, что в моей проблеме это не происходит. Можете ли вы принять мое решение для моей проблемы. Я отправляю свой код, если вы можете показать пример решения? БлагодаряПроблема с 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

Вы не упомянули проблему. У вас есть предупреждения/сбои/вещи не выполняются? В чем проблема? Кроме того, я не понимаю, почему вы выполняете 'callDectectionMove' в отдельном потоке, когда все, что у вас есть в этом методе, - это выполнение другого метода в основном потоке ... –

+0

У меня нет никакого сбоя и сходства, но когда if это правда 2 раза, программа не может обедать 2 разные темы. Я делаю эту структуру, потому что я хочу распознать движение акселерометра, и у меня должно быть 2 разных потока для 2-х разных движений 3 для 3 .... ok? – zp26

ответ

2

В коде [число self.arrayMovement] будет создано количество потоков, но они будут работать в последовательном порядке, поскольку все нити требуется выполнить функцию «detectMove» в главном потоке.

При выполнении следующего заявления:

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

-> сделать метод «detectMove» быть выполнен в главном потоке, один поток может выполнять только один оператор, в то время, из-за этого вы будете видеть последовательную работа с вами реализация потока.

0

В конечном счете, метод detectMove выполняется в основном потоке.
Я считаю, что detectPositionMovement также выполнен из основного потока.
Таким образом, выполнение любых detectMove не начнется до завершения detectPositionMovement.

Попробуйте позвонить detectMove непосредственно из detectPositionMovement (без callDectectionMove и без performSelectorOnMainThread).

0

Поместите точку разрыва в detectPositionMovement, а затем проверить, сколько раз эта строка выполняется:

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

, если она выполняется в 2 раза, то две нити быть посланным. если нет, то проверяет условия в блоке «if».

+0

на мой взгляд проблема заключается в «[self performSelectorOnMainThread: @selector (detectMove :) withObject: (NSNumber *) arrayIndex waitUntilDone: NO];» , потому что первая istruction выполнялась 2 раза, но performSelectorOnMainThread нет, потому что является исключительной. Моя проблема здесь. – zp26

+0

Вы хотите выполнить свой метод detectMove в двух разных потоках ?. Если да, то вы не должны размещать его на основном потоке. Потому что даже если вы создаете потоки, но внутри метода callDetectionMove вы выполняете код в основном потоке. Итак, наконец, выполнение происходит по основному потоку. – Ideveloper

+0

да, но для моей программы необходимо, чтобы потоки выполнялись для первого (без performSelectorOnMainThread моя программа не может их выполнить). И это большая проблема. – zp26

Смежные вопросы