【发布时间】:2011-09-09 05:18:58
【问题描述】:
我是 Objective-C 的新手。我目前正在处理线程。
我必须同步执行线程。我正在使用NSInvocationOperaion 生成一个线程。
我有两个线程。我需要等待第一个线程发出事件或超时信号。
可以通过NSConditionLock 发送事件信号。如何发出超时信号。我不能在这里使用waitUntilDate 方法,因为超时不是固定值。
有没有办法做到这一点?
已编辑
main.m
------
#import "PseudoSerialQueue.h"
#import "PseudoTask.h"
int main()
{
PseudoSerialQueue* q = [[[PseudoSerialQueue alloc] init] autorelease];
[q addTask:self selector:@selector(test0)];
[q addTask:self selector:@selector(test1)];
[q addTask:self selector:@selector(test2)];
[q quit];
return 0;
}
PseudoTask.h
-----------------
#import <Foundation/Foundation.h>
@interface PseudoTask : NSObject {
id target_;
SEL selector_;
id queue_;
}
@property(nonatomic,readonly)id target;
-(id)initWithTarget:(id)target selector:(SEL)selector queue:(id)queue;
-(void)exec;
@end
PseudoTask.m
-----------------
#import "PseudoTask.h"
@implementation PseudoTask
@synthesize target = target_;
-(id)initWithTarget:(id)target selector:(SEL)selector queue:(id)queue
{
self = [super init];
if (self) {
target_ = [target retain];
selector_ = selector;
queue_ = [queue retain];
}
return self;
}
-(void)exec
{
[target_ performSelector:selector_];
}
-(void)dealloc
{
[super dealloc];
[target_ release];
[queue_ release];
}
@end
PseudoSerialQueue.h
----------------------------
#import <Foundation/Foundation.h>
#import "PseudoTask.h"
@interface PseudoSerialQueue : NSObject {
NSCondition* condition_;
NSMutableArray* array_;
NSThread* thread_;
}
-(void)addTask:(id)target selector:(SEL)selector;
@end
PseudoSerialQueue.m
----------------------------
#import "PseudoSerialQueue.h"
@implementation PseudoSerialQueue
-(id)init
{
self = [super init];
if (self) {
array_ = [[NSMutableArray alloc]init];
condition_ = [[NSCondition alloc]init];
thread_ = [[NSThread alloc] initWithTarget:self selector:@selector(execQueue) object:nil];
[thread_ start];
}
return self;
}
-(void)addTask:(id)target selector:(SEL)selector
{
[condition_ lock];
PseudoTask* task = [[PseudoTask alloc] initWithTarget:target selector:selector queue:self];
[array_ addObject:task];
[condition_ signal];
[condition_ unlock];
}
-(void)quit
{
[self addTask:nil selector:nil];
}
-(void)execQueue
{
for(;;)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];
[condition_ lock];
if (array_.count == 0) {
[condition_ wait];
}
PseudoTask* task = [array_ objectAtIndex:0];
[array_ removeObjectAtIndex:0];
[condition_ unlock];
if (!task.target) {
[pool drain];
break;
}
[task exec];
[task release];
[pool drain];
}
}
-(void)dealloc
{
[array_ release];
[condition_ release];
[super dealloc];
}
@end
我无法从 main 传递 self。希望我错误地调用它。 错误:'self' undeclared 即将到来。
我无法理解 -(无效)执行 { [target_performSelector:selector_]; } 在 PseudoTask.m 中
target_ 不是一个方法,它是一个 ivar。 我没有收到任何错误或警告。但我无法理解该代码。
我写的是我从你的程序中理解的内容。如果我理解程序的方式有误,请纠正我。
线程 execQueue 在 PseudoSerialQueue 初始化时产生,它等待来自 addTask 方法的信号。 在quit方法中调用addTask方法,传递的参数是nil,不明白为什么要传递nil参数。
如果你能解释一下会很有帮助。谢谢。
【问题讨论】:
-
你使用了错误的条件锁,你应该在一个循环中检查条件:
while ([array count] == 0) [condition wait];只有两个线程这不太可能是一个问题,但你仍然应该做对。
标签: objective-c