[Pythonmac-SIG] newbie: threads in PyObjC

Tom Elliott telliott99 at mac.com
Tue Jun 5 03:06:30 CEST 2007


I'm using the PyObjC bridge.  I have a computation that will be  
triggered by a user.  It takes about 2 minutes depending on the  
database we're using.  I'd like the user to be able to kill it if he  
decides it's taking too long.

It seems like threading should be  the solution.  My simple demo  
based on what I read in NSThread related docs is as follows.  (I've  
put the NSAutoreleasePool call in twice here, but tried it in either  
place, separately).

from Foundation import *
from AppKit import *
import objc, time

from PyObjCTools import NibClassBuilder

class PyThreadAppDelegate(NibClassBuilder.AutoBaseClass):
     def init(self):
         self = super(PyThreadAppDelegate, self).init()
         return self

     def go_(self, sender):
         print 'go_'
         pool = NSAutoreleasePool.alloc().init()
         NSThread.detachNewThreadSelector_toTarget_withObject_(
             'newThread:', Threaded, None)
         del pool

     def kill_(self, sender):
         pass

class Threaded(NSObject):

     @objc.signature('v:@')
     def newThread_(obj):
         print 'Threaded'
         pool = NSAutoreleasePool.alloc().init()
         for i in range(5):
             time.sleep(1)
             print i
         del pool

This dies with:

===== Monday, June 4, 2007 8:53:09 PM US/Eastern =====
go_
2007-06-04 20:53:11.414 PyThread[555] *** _NSAutoreleaseNoPool():  
Object 0x1419cc0 of class NSCFString autoreleased with no pool in  
place - just leaking
2007-06-04 20:53:11.415 PyThread[555] *** +[Threaded newThread:]:  
selector not recognized
2007-06-04 20:53:11.415 PyThread[555] *** _NSAutoreleaseNoPool():  
Object 0x146cb10 of class NSCFString autoreleased with no pool in  
place - just leaking
2007-06-04 20:53:11.415 PyThread[555] *** _NSAutoreleaseNoPool():  
Object 0x146c9a0 of class NSCFString autoreleased with no pool in  
place - just leaking
2007-06-04 20:53:11.415 PyThread[555] *** _NSAutoreleaseNoPool():  
Object 0x146c980 of class NSException autoreleased with no pool in  
place - just leaking
2007-06-04 20:53:11.415 PyThread[555] An uncaught exception was raised
2007-06-04 20:53:11.415 PyThread[555] *** +[Threaded newThread:]:  
selector not recognized
2007-06-04 20:53:11.415 PyThread[555] *** Uncaught exception:  
<NSInvalidArgumentException> *** +[Threaded newThread:]: selector not  
recognized
Jun  4 20:53:12 joan-olsons-computer-2 crashdump[556]: PyThread crashed
Jun  4 20:53:12 joan-olsons-computer-2 crashdump[556]: crash report  
written to: /Users/jolson/Library/Logs/CrashReporter/PyThread.crash.log

In addition, I don't know how to talk to the thread to kill it.

Thanks for any help,

Tom Elliott
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/pythonmac-sig/attachments/20070604/5fdfd898/attachment-0001.html 


More information about the Pythonmac-SIG mailing list