gpt4 book ai didi

objective-c - NSCondition -> Objective-C

转载 作者:搜寻专家 更新时间:2023-10-30 20:22:39 24 4
gpt4 key购买 nike

我是 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 is coming.

我听不懂-(无效)执行{ [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];

I could not understand why to pass a nil parameter.

我只是为了PseudoSerialQueue中退出循环的消息才选择它。

关于objective-c - NSCondition -> Objective-C ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6251202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com