如何在同一个类中创建多个线程?

时间:2009-12-24 14:10:00

标签: iphone cocoa-touch multithreading

一切!我想在我的应用程序中创建多个线程。我'使用以下代码创建一个线程。 这个'buttonPress方法,我正在创建一个线程:

- (void) threadButtonPressed:(UIButton *)sender {

threadStartButton.hidden = YES;

    threadValueLabel.text = @"0";
threadProgressView.progress = 0.0;

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

}

这是'我在哪里调用线程的方法:

- (void)startMethod {

  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  [self performSelectorOnMainThread:@selector(threadMethod) withObject:nil waitUntilDone:NO];

  [pool release];

}

 - (void)threadMethod {

float actual = [threadProgressView progress];

    threadValueLabel.text = [NSString stringWithFormat:@"%.2f", actual];
if (actual < 1) {

    threadProgressView.progress = actual + 0.01;
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];
}

    else 
    threadStartButton.hidden = NO;  
 }

此主题正常运行。  但是当我尝试使用相同的方法在同一个类中创建另一个线程时,它会被正确创建,但是在方法“performSelectorOnMainThread”中,它不会执行该方法。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:0)

我在这里错过了上下文。我看到一个创建新线程的调用,然后我看到一个调用在主线程上执行选择器(调用方法)..

据我所知,您正在调用新线程(entryMethod)中的函数,在该线程中调用要在主线程(myMethod)上执行的方法。如果没有一些背景信息和可能的代码,我不明白这一点。

主线程是否可能忙于执行'myMethod'功能,因此不响应其他呼叫?

答案 1 :(得分:0)

您似乎正在尝试排队要在主线程上执行的方法。您可能想要查看NSOperationQueue和NSOperation对象。如果您想继续这条路径,可以考虑将repeats参数更改为YES。问题似乎是主线程在传递此消息时很忙。这将导致主线程阻塞。您也可以考虑不使用第二个threadMethod并回调主线程,而是将threadMethod的内容包装在@synchronized(self)块中。通过这种方式,您可以获得多线程的好处(多个代码同时执行,因此是一个被动的用户界面),而无需对主线程做一些奇怪的事情。

答案 2 :(得分:0)

为什么不能通过替换

使用相同的调用来执行此操作
     -(void)startMethod {

      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

      [self performSelectorOnMainThread:@selector(threadMethod) withObject:nil waitUntilDone:NO];

      [pool release];

}

 -(void)startMethod {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


  float actual = [threadProgressView progress];

  threadValueLabel.text = [NSString stringWithFormat:@"%.2f", actual];

  if (actual < 1) {

  threadProgressView.progress = actual + 0.01;
  [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];

  }

  else 
  threadStartButton.hidden = NO;

  }

  [pool release];

}