2009-12-24 106 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

相關問題