一切!我想在我的应用程序中创建多个线程。我'使用以下代码创建一个线程。 这个'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 :(得分: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];
}