用于停止正在运行的线程的实例变量

时间:2011-01-24 14:11:47

标签: iphone objective-c multithreading

标题:

@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作为停止执行标志。

我有以下问题:

  • 编译器发信号通知std c代码中间的self.cancelThread无效(self未定义)。我认为,它试图将该语句解释为c代码,但这是obj-c。

缺少什么?

更新:正如您之一建议的那样,它与丢失{}无关......代码在没有if(self.cancelThread){ conditions = NO; }的情况下完美运行。

2 个答案:

答案 0 :(得分:3)

  

- [CodeTest setCancelThread:]:无法识别的选择器。

表示您没有为cancelThread属性定义的setter。你错过了

@synthesize cancelThread;

(在您的@implementation部分)

答案 1 :(得分:1)

“/ *标准C99代码* /”是什么意思?

如果该代码确实被编译为C99代码,那么self.cancelThread是有问题的,因为它是一个Objective-C表达式。首先,它相当于[self cancelThread], a method call and, secondly, it requires self`,它不会出现在C99函数的主体中。

但是,鉴于您展示的代码在方法中有它,评论没有意义。