Проблема с Thread и NSTimer

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

        }
}

person zp26    schedule 26.07.2010    source источник


Ответы (3)


Вам действительно нужна другая тема? Вы хотите запустить таймер в этом фоновом потоке, почему вы не можете запустить таймер в основном потоке?

Чтобы ответить на ваш вопрос: первая проблема: ваш поток не работает достаточно долго, как предложил Гириш.

Вторая проблема: вы не зацикливаете цикл выполнения потока. Для работы таймера нужен цикл выполнения.

Смотрите также:

Запуск NSTimer в NSThread?

Резьбовой NSTimer

person tonklon    schedule 26.07.2010

Просто решено! Ключ запускает таймер в основном потоке

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

Надеюсь, это хеплс

person Abramodj    schedule 14.04.2011

Вы создаете NSTimer в угрозе, и объект таймера добавляется в пул (поскольку это метод класса), поэтому перед вызовом вашего таймера объект таймера будет освобожден (поскольку контекст потока будет завершен до того, как таймер будет запущен).

Есть 2 решения: 1. Добавьте счетчик удержания к объекту NSTimer и отпустите его, как только вы закончите работу с таймером. 2. Убедитесь, что ваш поток не завершен, пока таймер не завершит свою работу.

person Girish Kolari    schedule 26.07.2010
comment
Не совсем правильно. Запланированный таймер неявно сохраняется. Нет необходимости сохранять его. Твоя вторая мысль может быть жесткой. - person tonklon; 26.07.2010
comment
это концептуальный объект, добавляемый в текущий пул автоматического выпуска до того, как объект будет возвращен из метода класса. в вашем случае «пул» объекта - это текущий пул автоматического выпуска, который освобождается до выхода из потока. поэтому, когда `` пул '' будет освобожден, весь объект внутри него получит сообщение об освобождении - поэтому, чтобы сохранить объект, вы должны увеличить счетчик удержания на 1. - person Girish Kolari; 26.07.2010
comment
Я провел подробное исследование, используя образец программы, некоторые из наблюдений 1. Таймер запускается в том же цикле выполнения, в котором он был создан, каждый поток имеет свой собственный цикл выполнения, поэтому ваш поток должен работать, чтобы ваш таймер сработал в то время, когда у вас есть упомянул. 2. scheduleTimerWithTimeInterval возвращает объект NSTimer со счетчиком сохранения как «2», поэтому один счет будет уменьшен при освобождении пула автоматического освобождения, а второй будет уменьшен после запуска события таймера. - person Girish Kolari; 26.07.2010