Re: Weird Threads (repost)
Re: Weird Threads (repost)
- Subject: Re: Weird Threads (repost)
- From: Shawn Erickson <email@hidden>
- Date: Thu, 12 Feb 2004 18:10:21 -0800
On Feb 12, 2004, at 5:33 PM, Sam McCandlish wrote:
I am trying to use an NSThread for a complex drawing operation. In my
custom view, when drawRect is called, I detach to another method in
myself. The view draws fine. The problem is that the app still acts
like it's not multithreaded, the interface still locks up until the
drawing is complete. Any ideas?
Here is the drawRect function:
- (void)drawRect:(NSRect)rect {
[NSThread detachNewThreadSelector:@selector(drawRectThreaded:)
toTarget:self withObject:NSStringFromRect(rect)];
return;
}
Not sure how this would work given that your control of the graphic
context goes away after drawRect returns. Do you lock focus in your
drawRectThreaded method?
The first thread seems stuck in the following while the view is
drawing (this is copied from the debugger)
#0 0x90017048 in semaphore_wait_signal_trap
#1 0x9000e890 in _pthread_cond_wait
#2 0x92dca068 in -[NSViewHierarchyLock lockForWriting]
#3 0x92dd494c in -[NSView
_displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:]
#4 0x92ded8d0 in -[NSView displayIfNeeded]
#5 0x92dfe598 in -[NSWindow displayIfNeeded]
Note the "lockForWriting" in the above. It is attempting to lock the
view for updating and I bet your secondary thread is holding the lock,
which it likely needs to do when it is drawing.
Have you considered doing your complex drawing into an NSImage (lock
focus on the image and draw like your would normally) in a secondary
thread and then composite that image in your drawRect method? It would
make sense to only redraw / composite what has actually changed.
Anyway what are you doing in your complex drawing? We may be able to
suggest alternate solutions.
-Shawn
_______________________________________________
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.