2009-12-24 108 views
1

全部!我想在我的应用程序中创建多个线程。我'使用下面的代码来创建一个线程。 这种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”中,它不会执行该方法。任何人都可以帮我吗?

+0

你能描述你想要做什么?这听起来像是你试图在不同线程的主线程上运行一个方法,这种方式击败了多线程的目的,你不觉得吗?有一个理由要做到这一点,但从你的问题来看,你并不清楚你真的想要做什么,所以请给我们提供更多的信息,以便我们提供帮助。 – 2009-12-24 18:43:52

+0

请检查我编辑的问题! – neha 2009-12-25 05:22:51

+0

请让我知道如果我做了多余的事情。因为我第一次尝试这个。 – neha 2009-12-25 05:29:11

回答

0

看来你正在试图排队在主线程上执行的方法。你可能想看看一个NSOperationQueue和NSOperation对象。如果要继续此路径,则可以考虑将repeats参数更改为YES。问题似乎是主线程在传递此消息时处于忙碌状态。这会导致主线程阻塞。您也可以考虑不使用第二个threadMethod并回调主线程,而是将threadMethod的内容封装在@synchronized(self)块中。这样,您就可以获得多线程的好处(多个代码同时执行,因此是一个反应式用户界面),而不会在主线程中做一些奇怪的事情。

+0

Thanx RC Howe ...帮助! – neha 2010-01-02 12:56:02

0

我很想念这里的背景。我看到一个创建新线程的调用,然后我看到一个调用在主线程上执行一个选择器(调用一个方法)。

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

是否有可能主线程忙于执行'myMethod'函数,因此不响应其他调用?

+0

请检查我编辑的问题! – neha 2009-12-25 05:22:09

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]; 

}

+0

由于我是新的线程,我认为指定performSelectorOnMainThread是必要的。不是吗? – neha 2010-01-04 12:04:03

+0

通过指定你的代码返回到主线程,所以我认为,你可能没有通过这种方式获得线程的所有好处。 – Nithin 2010-01-05 03:32:53

相关问题