我是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.Hope 传递 self.Hope 我错误地调用它。
错误:'self' undeclared 来了。
我不明白
-(无效)执行
{
[target_ performSelector:selector_];
}
在 PseudoTask.m 中
target_ 不是一个方法,它是一个 ivar。
我没有收到任何错误或警告。但我无法理解该代码。
我正在写我从你的程序中理解的内容。如果我对程序的理解有误,请纠正我。
Thread execQueue 在 PseudoSerialQueue 初始化时产生,它等待来自 addTask 方法的信号。
在quit方法中调用addTask方法,传递的参数为nil。我不明白为什么要传递nil参数。
如果你解释一下会很有帮助。谢谢。
最佳答案
你是说 NSCondition 吗?您可以使用 waitUntilDate: 作为相对时间。
[condition lock];
// wait 5 seconds.
[condition waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
[condition unlock];
编辑:
我的 PseudoSerialQueue 类需要从 NSObject 派生的类中调用,如下所示。
@interface Test : NSObject
@end
@implementation Test
- (void)test0
{
}
- (void)test1
{
}
- (id)init
{
self = [super init];
return self;
}
- (void)exec
{
PseudoSerialQueue *q = [[PseudoSerialQueue alloc] init];
[q addTask:self selector:@selector(test0)];
[q addTask:self selector:@selector(test1)];
[q addTask:self selector:@selector(test0)];
[q quit];
}
@end
您可以从主函数调用它。
Test *test = [[Test alloc] init];
[test exec];
我只是选择它作为退出 PseudoSerialQueue 中的循环的消息。
关于objective-c - NSCondition -> 目标 C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6251202/