[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: NSThread
From: |
Patrick Stein |
Subject: |
Re: NSThread |
Date: |
Wed, 22 Nov 2000 20:32:41 +0100 |
"Philippe C.D. Robert" <robert@iam.unibe.ch> wrote:
>I am now playing around with multi-threaded scenegraph rendering/updating
in
>the 3DKit. I'd like to use GNUstep's thread support to handle this, but I
am
>not sure if this is possible. I need a way to 'wait' for all threads to
finish
>before going on with handling new rendering tasks. Is this possible? I did
not
>see anything which could handle this in the documentation...
>
>any hints?
You normally create a set of worker threads at the beginning, cause thread
creation and destruction takes time ( and there was a bug in the former
openstep which crashed the system that way ). And then create a working
Queue.
Every worker than takes it's stuff from the queue 'till it's done.
In case you need a such a queue , I appended one which works fine for me.
stay cool - jolly
===================================================================
Patrick Stein or Jolly at jinx dot de
===================================================================
" Hickory, dickory, dock,
The mouse ran up the clock.
The clock struck one,
The mouse ran down,
Hickory, dickory, dock. " - nursery rhyme
===================================================================
MTQueue.m ( MultiThreaded Queue )
#import "MTQueue.h"
#define QUEUE_EMPTY 0
#define QUEUE_NOT_EMPTY 1
@implementation MTQueue
{
NSConditionLock *queueLock;
NSMutableArray *queueArray;
}
- init
{
[super init];
queueLock = [[NSConditionLock alloc] initWithCondition:QUEUE_EMPTY];
queueArray = [[NSMutableArray alloc] init];
return self;
}
- (void) dealloc
{
[queueLock release];
[queueArray release];
[super dealloc];
}
- pop;
{
id anObject;
[queueLock lockWhenCondition:QUEUE_NOT_EMPTY];
anObject = [[[queueArray objectAtIndex:0] retain] autorelease];
[queueArray removeObjectAtIndex:0];
[queueLock unlockWithCondition:([queueArray
count]?QUEUE_NOT_EMPTY:QUEUE_EMPTY)];
return anObject;
}
- popDoNotBlock;
{
id anObject=nil;
[queueLock lock];
if([queueArray count])
{
anObject = [[[queueArray objectAtIndex:0] retain] autorelease];
[queueArray removeObjectAtIndex:0];
}
[queueLock unlockWithCondition:([queueArray
count]?QUEUE_NOT_EMPTY:QUEUE_EMPTY)];
return anObject;
}
- (void) push:(id)anObject;
{
[queueLock lock];
[queueArray addObject:anObject];
[queueLock unlockWithCondition:([queueArray
count]?QUEUE_NOT_EMPTY:QUEUE_EMPTY)];
}
- (unsigned int) count;
{
return [queueArray count];
}
@end
- NSThread, Philippe C.D. Robert, 2000/11/22
- Re: NSThread,
Patrick Stein <=