RE: Sending object between threads.
RE: Sending object between threads.
- Subject: RE: Sending object between threads.
- From: "Jake A. Repp" <email@hidden>
- Date: Mon, 20 Jan 2003 11:51:57 -0800
- Thread-topic: Sending object between threads.
Although it's unrelated to your problem directly (encoding/decoding
custom objects). If you are connecting a NSPort on a run loop and use a
NSPortMessage to send data you can send pointers to in process memory
locations without any problems. This is speedier than encoding/decoding
the objects.
Sounds like you have most everything you need in place but you should
check out Nathan Day's example:
http://homepage.mac.com/nathan_day
Which is a really good general case implementation.
I have done a specialized implementation for a background HTTP worker
passing notification pointers based on that method:
http://jrepp.com/cocoabb/viewtopic.php?t=64
-jake
-----Original Message-----
From: Terry Smyth [
mailto:email@hidden]
Sent: Monday, January 20, 2003 9:51 AM
To: email@hidden
Subject: Sending object between threads.
Hi,
Following the example given in the Cocoa documentation "Forming
Connections Between Threads", I have implemented a separate thread in
my app to do some stuff, using NSConnection/NSPort to communicate
between the main thread and the worker thread. It all works, except
that I'm having trouble passing my own custom objects to and from the
worker thread (so I can't actually get my worker to do any useful
work!!). I can pass other cocoa objects (eg NSString) just fine, and
they appear intact at the other side of the connection. If I pass my
own object, I just get junk at the other end.
Objects of my custom class conform to NSCoding, but my encodeWithCoder:
and initWithCoder: methods never get called. Have I missed something
obvious here, or is it more likely a dumb coding bug? I'm going round
in circles reading the documentation, but can't see what I'm doing
wrong. Can anyone suggest what I might have missed, or where I can go
for further reading (better still, is there any sample code which does
this - I couldn't find any?)
Here's what my custom object looks like:
@interface ChangerRequest : NSObject <NSCoding>
{
unsigned long requestID;
RequestType type;
BOOL isRunning;
}
@end
@implementation ChangerRequest
- (id)init
{
requestID = INVALID_REQUEST_ID;
isRunning = NO;
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeValueOfObjCType: @encode (unsigned long) at:
&requestID];
[coder encodeValueOfObjCType: @encode (RequestType) at: &type];
[coder encodeValueOfObjCType: @encode (BOOL) at: &isRunning];
}
- (id) initWithCoder: (NSCoder *)coder
{
// Must decode keys in same order as encodeWithCoder:
[coder decodeValueOfObjCType: @encode (unsigned long) at:
&requestID];
[coder decodeValueOfObjCType: @encode (RequestType) at: &type];
[coder decodeValueOfObjCType: @encode (BOOL) at: &isRunning];
return self;
}
and my call to the worker thread looks like this:
// Allocate and initialise a new request.
ChangerRequest *theRequest = [[ChangerRequest alloc] init];
[theRequest setCaller: (id)0x98765]; // Some junk just to see it
working.
[theRequest setType: fourth_type];
[requests addObject: theRequest]; // maintain a list of outstanding
requests.
// Now send the request to the server to be actioned.
[requestServer newRequestFromClient: theRequest];
where requestServer was set up in method setServer (as described in the
documentation), and the function newRequestFromClient is defined in a
protocol as follows:-
@protocol RequestHandlerServerMethods
- (void) newRequestFromClient: (ChangerRequest *) theRequest;
@end
Any help very much appreciated,
Terry Smyth
SGL
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.