2010-07-26 84 views
0

我的代碼有問題。 我想啓動線程,但啓動時它們不能啓動NS​​Timer構造。 你能幫我嗎?線程和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]]; 

     } 
} 

回答

0

你是在威脅和定時器對象創建的NSTimer被添加到池(因爲它是類的方法),所以在你的計時器獲取調用計時器對象將被釋放(因爲線程上下文將超過前定時器被觸發)。

有2個解決方案 1.添加保留計數到的NSTimer對象和釋放,一旦你用計時器完成工作。 2.確保您的線程在計時器完成工作之前不會退出。

+0

不完全正確。計劃的計時器被隱式保留。沒有必要保留它。你的第二個想法可能是正確的。 – tonklon 2010-07-26 14:48:46

+0

它是在從類方法返回對象之前將對象添加到當前自動釋放緩衝池的概念。 案例對象'pool'是當前線程退出之前釋放的自動釋放池。所以當「池」被釋放它裏面的所有對象會得到釋放消息 - 所以保留了對象,你應該1. – 2010-07-26 15:00:29

+0

我用一個示例程序做了詳細的研究,一些意見 1.定時器增加保留計數在它創建的同一個運行循環中觸發,每個線程都有自己的運行循環,所以你的線程應該運行,讓你的計時器在你提到的時間觸發。 2. scheduledTimerWithTimeInterval返回與保留計數爲對象的NSTimer「2」那麼,當自動釋放池被釋放,一旦定時事件被觸發第二個將被降低一個數量將會減少。 – 2010-07-26 18:04:57

1

你真的,真的需要一個不同的主題?你想在該背景下啓動一個定時器線程,爲什麼你不能在主線程上啓動定時器?

要回答你的問題: 拳頭的問題是:你的線程不運行足夠長的像吉里什建議。

第二個問題是:你是不是循環線程的runloop。定時器工作需要runloop。

參見:

Running NSTimer Within an NSThread?

Threaded NSTimer

1

就解決了!關鍵是啓動定時器在主線程

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

希望這hepls