如何在同一个类中创建多个线程?
全部!我想在我的应用程序中创建多个线程。我'使用下面的代码来创建一个线程。 这种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”中,它不会执行该方法。任何人都可以帮我吗?
看来你正在试图排队在主线程上执行的方法。你可能想看看一个NSOperationQueue和NSOperation对象。如果要继续此路径,则可以考虑将repeats
参数更改为YES
。问题似乎是主线程在传递此消息时处于忙碌状态。这会导致主线程阻塞。您也可以考虑不使用第二个threadMethod
并回调主线程,而是将threadMethod
的内容封装在@synchronized(self)
块中。这样,您就可以获得多线程的好处(多个代码同时执行,因此是一个反应式用户界面),而不会在主线程中做一些奇怪的事情。
Thanx RC Howe ...帮助! – neha 2010-01-02 12:56:02
我很想念这里的背景。我看到一个创建新线程的调用,然后我看到一个调用在主线程上执行一个选择器(调用一个方法)。
据我所知,您正在调用一个新线程中的函数(entryMethod ),在其中调用一个方法在主线程(myMethod)上执行。我不明白这一点,没有一些背景信息和可能的一些代码。
是否有可能主线程忙于执行'myMethod'函数,因此不响应其他调用?
请检查我编辑的问题! – neha 2009-12-25 05:22:09
为什么你不能用同一调用做到这一点,通过更换
-(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];
}
你能描述你想要做什么?这听起来像是你试图在不同线程的主线程上运行一个方法,这种方式击败了多线程的目的,你不觉得吗?有一个理由要做到这一点,但从你的问题来看,你并不清楚你真的想要做什么,所以请给我们提供更多的信息,以便我们提供帮助。 – 2009-12-24 18:43:52
请检查我编辑的问题! – neha 2009-12-25 05:22:51
请让我知道如果我做了多余的事情。因为我第一次尝试这个。 – neha 2009-12-25 05:29:11