2011-01-24 3 views
0

헤더를 중지 :인스턴스 변수는 실행 스레드

@interface CodeTest : NSObject { 
BOOL cancelThread; 
} 

-(void) testCode; 
-(void) stopRunning; 
-(void) startRunning; 

@property (assign) BOOL cancelThread; 
@end 

구현 : 당신이 볼 수 있듯이

-(void)stopRunning{ 
    self.cancelThread = YES; 
} 

-(void)startRunning{ 
    self.cancelThread = NO; 

    [NSThread detachNewThreadSelector:@selector(testCode) toTarget:self withObject:nil]; 

} 
-(void)testCode{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSLog(@"STARTED"); 
    /* Std C99 code */ 
    while(conditions){ 
      if(self.cancelThread){ 
       conditions = NO; 
      } 
      ... 
      ... 
    } 
    /* end of C code */ 
    [pool release]; 
} 

, 그것은 타이어는 별도의 스레드에서 testCode을 실행하고 정지로 cancelThread BOOL을 사용하는 별도의 스레드에서 실행 플래그.

  • 컴파일러 신호 성병 C 코드의 중간 self.cancelThread는 (자체가 정의되지 않은) 유효하지 :

    는 I는 다음의 문제를 가지고있다. 제 생각에는,이 문장을 C 코드로 해석하려고 시도하지만 이것은 obj-c입니다.

뭔가가 있습니까?

업데이트 : {} 님의 제안 중 하나가 누락 된 것과 관련이 없습니다. if(self.cancelThread){ conditions = NO; }없이 코드가 완벽하게 작동합니다.

+0

'@property (assign) BOOL cancelThread;에서 경고를받지 못하겠습니까? 나는 이것에 대한 해결책은 아니라고 생각하지만'@property (nonatomic) BOOL cancelThread'을 필요로하고'testCode'메소드 안에 autorelease 풀을 설정해야합니다. (NSThread 호출을 감싸지 않음) – nacho4d

+3

@ nacho4d 실제로, 값이 여러 스레드에 의해 설정/검사되고 있기 때문에이 경우에는 "비 원자력"을 원하지 않을 것입니다. 'testCode' 메쏘드 안에서 autorelease 풀을하는 것이 옳습니다. –

+0

감사합니다. 말한대로 autorelease 풀을 수정했습니다! – Kami

답변

3

- [CodeTest setCancelThread :] : 인식 할 수없는 선택기입니다.

cancelThread 속성에 대해 정의 된 설정자가 없음을 나타냅니다. 당신은 당신이 "/ * 표준 C99 코드 * /"무엇을 의미합니까

+0

완벽! 하지만 C에 대한 self.cancelTread 정보는 무엇입니까 – Kami

+0

일치하지 않는 {}이 있는지 확인하십시오. –

1

(당신의 @implementation 섹션에서)

@synthesize cancelThread; 

을 누락 되었습니까?

코드가 실제로 C99 코드로 컴파일되는 경우 self.cancelThread은 Objective-C 표현식이므로 문제가 있습니다. 첫째, 이것은 [self cancelThread], a method call and, secondly, it requires self`의 동등 물로서 C99 함수의 본문에는 존재하지 않습니다.

그러나 표시된 코드에 메서드가 있으므로 주석이 이해가되지 않습니다.

관련 문제