doBackgroundWork方法不会从startDoingWork方法中调用。为什么我的后台线程不运行?
threading.h
------------
#import <Foundation/Foundation.h>
@interface threading : NSObject {
NSConditionLock* theConditionLock;
NSMutableArray* workItems;
}
-(void)startDoingWork;
-(void)doBackgroundWork;
-(void)notifyBackgroundThreadAboutNewWork;
@end
threading.m
-------------
#import "threading.h"
enum{
workToDoNow = 1,
workNotToDoNow = 0
};
@implementation threading
-(id)init{
if (self = [super init]) {
theConditionLock = [[NSConditionLock alloc]initWithCondition:workNotToDoNow];
workItems = [[NSMutableArray alloc]init];
}
return self;
}
-(void)startDoingWork{
[NSThread detachNewThreadSelector:@selector(doBackgroundWork) toTarget:self withObject:nil];
}
-(void)doBackgroundWork{
while (YES) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];
NSArray* items = nil;
NSLog(@"Going to lock!!");
[theConditionLock lockWhenCondition:workToDoNow];
items = [NSArray arrayWithArray:workItems];
[workItems removeAllObjects];
[theConditionLock unlockWithCondition:workNotToDoNow];
NSLog(@"Finished the work!!");
[pool drain];
}
}
-(void)notifyBackgroundThreadAboutNewWork{
NSLog(@"Into the Background new work!!");
[theConditionLock lock];
[workItems addObject:@"Hello"];
[theConditionLock unlockWithCondition:workToDoNow];
NSLog(@"Finished and came out!!");
}
@end
main.m
------
#import <Foundation/Foundation.h>
#import "threading.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
threading* threads = [[threading alloc]init];
[threads notifyBackgroundThreadAboutNewWork];
[threads startDoingWork];
[pool drain];
return 0;
}
detachNewThread:selector:toTarget:withObject方法在调试时不会被调用。
1)执行是否到达'[threads startDoingWork]'线? 2)你在控制台中得到什么? 3)您是否考虑过使用[GCD](http://stackoverflow.com/questions/tagged/grand-central-dispatch)? – zoul 2011-05-30 07:18:35
@zoul:是的,它达到了。当它在detachNewThreadSelector上时,它不会跳到doBackgroundWork线程上。它出自startDoingWork方法。 – spandana 2011-05-30 07:21:42
我在控制台上单独获取notifybackgroundThreadAboutNewWork方法的输出 – spandana 2011-05-30 07:24:59