Проблема с NSThread - PullRequest
       4

Проблема с NSThread

1 голос
/ 27 июля 2010

У меня проблема с моим кодом. Я хочу создать 2 разных экземпляра с помощью 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

Ответы [ 3 ]

2 голосов
/ 27 июля 2010

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

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

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

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

0 голосов
/ 27 июля 2010

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

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

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

0 голосов
/ 27 июля 2010

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

Попробуйте вызвать detectMove напрямую из detectPositionMovement (без callDectectionMove и без performSelectorOnMainThread).

...