跟踪iphone上的多个线程

时间:2010-07-18 18:39:13

标签: iphone multithreading

我正在尝试做一些基本的事情来理解带有计数器的线程,当按下按钮时,该计数器只会递增,每次按下按钮时,都会启动一个递增同一计数器的新线程。然后我有一个停止按钮来停止正在运行的线程。如何判断有多少线程或哪个线程正在运行?这是我正在处理的基本模板。感谢。

-(int)count {
    return count;
}

-(void)setCount:(int) value {
    count = value;
}

-(void)updateDisplay {
    countLabel = [NSString stringWithFormat:@"%i", count];
    count++;
}

-(void)myThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self performSelectorOnMainThread:@selector(updateDisplay)
                           withObject:nil
                        waitUntilDone:NO];
    [pool release];
}

-(void)startThread {
    [self performSelectorInBackground:@selector(myThread) withObject:nil];
}

-(void)myThreadStop {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self performSelectorOnMainThread:@selector(updateDisplay)
                           withObject:nil 
                        waitUntilDone:NO];
    [pool release];
}

-(void)stopThread {
    [self performSelectorInBackground@selector(myThreadStop) withObject:nil];
}

2 个答案:

答案 0 :(得分:0)

基本上,您希望跟踪已运行的线程数,并为每个线程分配唯一的ID。假设startThread是按钮的事件处理程序,您可能会遇到类似:

的内容
static int threadIndex = 0;
static int threadsRunning = 0;

-(void)startThread {
    NSNumber* threadId = [NSNumber numberWithInt:threadIndex++];
    threadsRunning++;
    [self performSelectorInBackground:@selector(myThread) withObject:threadId];
}

然后当你停止一个线程时,你只需递减threadsRunning

但是,看看你的代码,我对你的stopTread方法感到困惑,因为它似乎与myThread方法完全相同,即根本不停止线程

答案 1 :(得分:0)

您正在后台执行某些操作,这与显式创建线程不同(例如,它可能会重用线程池中的线程)。

如果您想要效率非常低的线程代码,可以使用以下内容:

NSThread * thread = [[[NSThread alloc] initWithTarget:self selector:@selector(myThread) object:nil] autorelease];
[thread start];
while ([thread isExecuting])
{
  NSLog(@"Still running");
  [NSThread sleepForTimeInterval:0.1];
}

编辑:如果您真的要进行iPhone开发,我建议您改为使用NSOperation / NSInvocationOperation / NSBlockOperation。正确的做法是线程管理。