Thread: [Pyobjc-dev] Python thread and pyobjc? (help)
Brought to you by:
ronaldoussoren
From: whamoo <wh...@rk...> - 2005-01-26 10:45:35
|
Hi to all, I'm trying to write a simple mud client (a simple telnet client), but i have some problem with python thread and cocoa. I launch my app, but no result and when i call sendcommand_() my app enter in a infinite loop that freeze my app.... Some idea? Thanks a lot =) ------------ from PyObjCTools import NibClassBuilder, AppHelper import telnetlib import thread import time import telnet NibClassBuilder.extractClasses("MainMenu") # class defined in MainMenu.nib class mud(NibClassBuilder.AutoBaseClass): # the actual base class is NSObject # The following outlets are added to the class: # inputField # mainText # sendButt # win conn = None def sendcommand_(self, sender): com = self.inputField.stringValue() self.conn.sendtxt("com") def applicationWillFinishLaunching_(self, aNotification): self.conn = telnetlib.Telnet("an host", a port) thread.start_new_thread(self.getmud, ()) def getmud(self): while 1: txt = "" txt = self.conn.read_eager() if txt != "": self.mainText.setString_(txt) if __name__ == "__main__": AppHelper.runEventLoop() Whamoo www.rknet.it Powered by: - MacOsX - Gnu / Linux Debian Sarge - Amiga Os 3.9 - Milk |
From: Bob I. <bo...@re...> - 2005-01-26 11:49:14
|
On Jan 26, 2005, at 5:46 AM, whamoo wrote: > I'm trying to write a simple mud client (a simple telnet client), but > i have some problem with python thread > and cocoa. > I launch my app, but no result and when i call sendcommand_() my app > enter in a infinite loop that freeze my app.... > Some idea? Thanks a lot =) Well, multithreading is a lot more complicated than you think it is. You should probably not use explicit multithreading, and use either Twisted or NSFileHandle for networking. Here is some code that uses NSFileHandle: <http://svn.red-bean.com/pyobjc/trunk/pyobjc/Examples/NonFunctional/ RemotePyInterpreter/AsyncPythonInterpreter.py>. Anyway, there are a lot of things wrong with your code: You can't talk to Cocoa from a second thread, so self.mainText.setString_(...) is not valid in that context. Instead, you need to do: self.mainText.performSelectorOnMainThread_withObject_waitUntilDone_ ('setString:', txt, False). I would probably even put this selector in another object entirely, so you're more aware that they are separate threads and shouldn't call into each other directly. I don't think sendtxt is a method of telnetlib.Telnet? You probably want write instead. You shouldn't be talking directly to telnetlib.Telnet from the main thread, the write methods will block and I don't think it has locks. Create a Queue.Queue, post all of the text you want to write to that, and empty the queue during the while loop in your secondary thread. The string you are getting from telnet is a str, not unicode, so anything above chr(128) can probably cause an exception and crash your secondary thread. Since you're dispatching thread on a selector you should probably change the signature "getmud" to "getMud_" and use: NSThread.detachNewThreadSelector_toTarget_withObject_('getMud:', self, None). Python threads don't register themselves with Foundation so unpredictable things can happen if you're using Python threads and calling Objective-C stuff before calling NSThread.currentThread(). At the top of getMud_ you should probably do NSAutoreleasePool.alloc().init(). New threads don't have one automatically. Every thread that calls any Objective-C code needs an NSAutoreleasePool. -bob |
From: <joa...@ma...> - 2005-02-09 06:59:10
|
Hello. I have written an app that goes through a bunch of source-files and=20 returns a list of tuples. This can take close to 30 seconds, during=20 which the interface is blocked. Can anyone give me some suggestions on=20 how to move forward. Should I stick to cocoa-threads since I am using=20 PyObjC? All the file handling is read only. I have been looking for=20 examples, but all that I can find shows XML-RPC that seems to handle its=20 own threading. Here is my current code adapted from the WebServicesTool=20 example. Is there someway I can easily extend this? def getMethods(self): self._methodList =3D[] self.startWorking() # Starts a Process indicator in the document=20 window. filelist =3DGlobDirectoryWalker(self._server, "*.m") # Does a=20 recursive find of all files with the suffix .m for filename in filelist: self.receiveMethods(filename) self.stopWorking() self.setStatusTextFieldMessage_("Found %d methods." %=20 len(self._methodList)) self.methodsTable.reloadData() =20 def receiveMethods(self, filename): a =3D hbalance.getList(filename) # getList returns a list of tu= ples if a : # Safety self._OrigList +=3D a # add the list to the=20 masterlist self._methodList=3Dself._OrigList self.methodsTable.reloadData() # show the list in a NSTableView Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-09 07:42:14
|
On Feb 9, 2005, at 1:59 AM, Joachim M=E5rtensson wrote: > I have written an app that goes through a bunch of source-files and=20 > returns a list of tuples. This can take close to 30 seconds, during=20 > which the interface is blocked. Can anyone give me some suggestions on=20= > how to move forward. Should I stick to cocoa-threads since I am using=20= > PyObjC? All the file handling is read only. I have been looking for=20 > examples, but all that I can find shows XML-RPC that seems to handle=20= > its own threading. Here is my current code adapted from the=20 > WebServicesTool example. Is there someway I can easily extend this? The WebServicesTool example does use threads directly. XML-RPC doesn't=20= handle its own threading. The example you gave isn't really sufficient=20= to give any suggestions. An alternative is using Twisted, which is asynchronous and provides=20 Cocoa runloop integration (you must use Twisted from SVN though, 1.3.0=20= doesn't work with PyObjC 1.1 and later and a patch was never released).=20= There are also examples for that. -bob |
From: <joa...@ma...> - 2005-02-10 14:12:26
|
Bob Ippolito wrote: > The WebServicesTool example does use threads directly. XML-RPC=20 > doesn't handle its own threading. The example you gave isn't really=20 > sufficient to give any suggestions. > > An alternative is using Twisted, which is asynchronous and provides=20 > Cocoa runloop integration (you must use Twisted from SVN though, 1.3.0=20 > doesn't work with PyObjC 1.1 and later and a patch was never=20 > released). There are also examples for that. > > -bob > Ok I have been looking a bit at the Twisted docs and examples( I=20 mistakenly thought Twisted was a part of XML-RPC, that and the comment=20 in the ReadMe about not being a multi-threaded app led me to believe=20 that it didn`t use threads), it seems that Twisted might be what I am=20 looking for. I downloaded Twisted from SVN via "svn co=20 svn://svn.twistedmatrix.com/svn/Twisted/trunk Twisted". There are zero=20 installation directions however (or they are very well hidden), and the=20 online documentation also seem to be void except for some reference to=20 debian. Could you please give me some hints as how to install this?=20 About the dependencies (pyOpenSSL, pycrypto and SOAPpy) to Twisted are=20 the once on http://undefined.org/python/pimp/ up to date, or do I need=20 newer versions of these also? Thanks in advance Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-10 15:52:17
|
On Feb 10, 2005, at 9:12, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> The WebServicesTool example does use threads directly. XML-RPC=20 >> doesn't handle its own threading. The example you gave isn't really=20= >> sufficient to give any suggestions. >> >> An alternative is using Twisted, which is asynchronous and provides=20= >> Cocoa runloop integration (you must use Twisted from SVN though,=20 >> 1.3.0 doesn't work with PyObjC 1.1 and later and a patch was never=20 >> released). There are also examples for that. >> > Ok I have been looking a bit at the Twisted docs and examples( I=20 > mistakenly thought Twisted was a part of XML-RPC, that and the comment=20= > in the ReadMe about not being a multi-threaded app led me to believe=20= > that it didn`t use threads), it seems that Twisted might be what I am=20= > looking for. I downloaded Twisted from SVN via "svn co=20 > svn://svn.twistedmatrix.com/svn/Twisted/trunk Twisted". There are=20 > zero installation directions however (or they are very well hidden),=20= > and the online documentation also seem to be void except for some=20 > reference to debian. Could you please give me some hints as how to=20 > install this? About the dependencies (pyOpenSSL, pycrypto and SOAPpy)=20= > to Twisted are the once on http://undefined.org/python/pimp/ up to=20 > date, or do I need newer versions of these also? Those dependencies are not up to date, and they're all optional anyway.=20= I'm unsure about the status of setup.py in svn, so here are manual=20 instructions: (1) install zope.interface I have an installer here:=20 http://undefined.org/python/zope.interface-3.0.1-py2.3-macosx10.3.zip (2) build the cfsupport module % cd Twisted/twisted/internet/cfsupport % python setup.py build_ext -i % mv cfsupport.so .. (3) put the 'twisted' package on your sys.path -bob |
From: <joa...@ma...> - 2005-02-13 17:17:48
|
Bob Ippolito wrote: > > Those dependencies are not up to date, and they're all optional=20 > anyway. I'm unsure about the status of setup.py in svn, so here are=20 > manual instructions: > > (1) install zope.interface > > I have an installer here:=20 > http://undefined.org/python/zope.interface-3.0.1-py2.3-macosx10.3.zip > > (2) build the cfsupport module > % cd Twisted/twisted/internet/cfsupport > % python setup.py build_ext -i > % mv cfsupport.so .. > > (3) put the 'twisted' package on your sys.path > > -bob > I have followed your instructions but I can not get it to work. When I=20 build WebServicesTool ( I use that as a reference) I get "ImportError:=20 No module named _CarbonEvt", I get the same error when I build my own=20 app. I have looked at google for advice but I can find nothing that=20 would help me. Please advice. Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-13 18:29:59
|
On Feb 13, 2005, at 12:17, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> >> Those dependencies are not up to date, and they're all optional=20 >> anyway. I'm unsure about the status of setup.py in svn, so here are=20= >> manual instructions: >> >> (1) install zope.interface >> >> I have an installer here:=20 >> http://undefined.org/python/zope.interface-3.0.1-py2.3-macosx10.3.zip >> >> (2) build the cfsupport module >> % cd Twisted/twisted/internet/cfsupport >> % python setup.py build_ext -i >> % mv cfsupport.so .. >> >> (3) put the 'twisted' package on your sys.path >> > I have followed your instructions but I can not get it to work. When I=20= > build WebServicesTool ( I use that as a reference) I get "ImportError:=20= > No module named _CarbonEvt", I get the same error when I build my own=20= > app. I have looked at google for advice but I can find nothing that=20 > would help me. Please advice. That can't possibly happen with the Python 2.3.0 that ships with Mac OS=20= X 10.3 -- it's part of the standard library! -bob |
From: Steve S. <st...@sp...> - 2005-02-13 18:41:55
|
Is it possible you have another python on your system that's getting =20 used? e.g., fink (/sw/bin/python?) -steve On Feb 13, 2005, at 1:29 PM, Bob Ippolito wrote: > > On Feb 13, 2005, at 12:17, Joachim M=E5rtensson wrote: > >> Bob Ippolito wrote: >> >>> >>> Those dependencies are not up to date, and they're all optional =20 >>> anyway. I'm unsure about the status of setup.py in svn, so here are = =20 >>> manual instructions: >>> >>> (1) install zope.interface >>> >>> I have an installer here: =20 >>> http://undefined.org/python/zope.interface-3.0.1-py2.3-=20 >>> macosx10.3.zip >>> >>> (2) build the cfsupport module >>> % cd Twisted/twisted/internet/cfsupport >>> % python setup.py build_ext -i >>> % mv cfsupport.so .. >>> >>> (3) put the 'twisted' package on your sys.path >>> >> I have followed your instructions but I can not get it to work. When =20= >> I build WebServicesTool ( I use that as a reference) I get =20 >> "ImportError: No module named _CarbonEvt", I get the same error when =20= >> I build my own app. I have looked at google for advice but I can find = =20 >> nothing that would help me. Please advice. > > That can't possibly happen with the Python 2.3.0 that ships with Mac =20= > OS X 10.3 -- it's part of the standard library! > > -bob > > > > ------------------------------------------------------- > SF email is sponsored by - The IT Product Guide > Read honest & candid reviews on hundreds of IT Products from real =20 > users. > Discover which products truly live up to the hype. Start reading now. > http://ads.osdn.com/?ad_ide95&alloc_id=14396&op=CCk > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev > |
From: <joa...@ma...> - 2005-02-13 19:02:23
|
Steve Spicklemire wrote: > Is it possible you have another python on your system that's getting > used? e.g., fink (/sw/bin/python?) > > -steve I have Python in my fink library. Is there some way to check if thats the one that is used? |
From: Bob I. <bo...@re...> - 2005-02-13 19:08:58
|
On Feb 13, 2005, at 14:02, Joachim M=E5rtensson wrote: > Steve Spicklemire wrote: > >> Is it possible you have another python on your system that's getting =20= >> used? e.g., fink (/sw/bin/python?) > > I have Python in my fink library. Is there some way to check if thats=20= > the one that is used? % which python /usr/bin/python -bob |
From: <joa...@ma...> - 2005-02-13 19:52:01
|
Bob Ippolito wrote: > > % which python > /usr/bin/python > > -bob > Ok thanks I had /usr/local/bin/python for some reason. I have now changed it to /usr/bin/python. However now it complains that I have no module named os, really weird. Especially since I can import os from python interactive just fine. Further investigations show that I have two python.frameworks. /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/ /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/ Should I remove one of them? It seems like I have nuked my system somehow. |
From: Bob I. <bo...@re...> - 2005-02-13 19:58:06
|
On Feb 13, 2005, at 14:51, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> >> % which python >> /usr/bin/python >> > Ok thanks I had /usr/local/bin/python for some reason. I have now=20 > changed it to /usr/bin/python. However now it complains that I have no=20= > module named os, really weird. Especially since I can import os from=20= > python interactive just fine. Further investigations show that I have=20= > two python.frameworks. > = /System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/ > /Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/ > > Should I remove one of them? It seems like I have nuked my system=20 > somehow. I'm not sure what you did. Rename or move the /Library/Frameworks one=20= and see if the problem goes away. -bob |
From: <joa...@ma...> - 2005-02-13 18:58:16
|
Bob Ippolito wrote: > > That can't possibly happen with the Python 2.3.0 that ships with Mac=20 > OS X 10.3 -- it's part of the standard library! > > -bob > I have installed the Python 2.3.5 package from this page, maybe that has=20 something to do with it? http://homepages.cwi.nl/~jack/macpython/beta.html Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-13 19:55:43
|
On Feb 13, 2005, at 13:58, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> >> That can't possibly happen with the Python 2.3.0 that ships with Mac=20= >> OS X 10.3 -- it's part of the standard library! >> > I have installed the Python 2.3.5 package from this page, maybe that=20= > has something to do with it? > http://homepages.cwi.nl/~jack/macpython/beta.html Yes, that is probably the reason. Either remove /usr/local/bin/python=20= or make sure /usr/bin comes before /usr/local/bin in your PATH -- my=20 directions were written specifically for the Python 2.3.0 that ships=20 with OS X 10.3. I have not tested them in any other way. -bob |
From: Donovan P. <dp...@ul...> - 2005-02-10 15:54:58
|
On Feb 10, 2005, at 6:12 AM, Joachim M=E5rtensson wrote: > Ok I have been looking a bit at the Twisted docs and examples( I=20 > mistakenly thought Twisted was a part of XML-RPC, that and the comment=20= > in the ReadMe about not being a multi-threaded app led me to believe=20= > that it didn`t use threads), it seems that Twisted might be what I am=20= > looking for. I downloaded Twisted from SVN via "svn co=20 > svn://svn.twistedmatrix.com/svn/Twisted/trunk Twisted". There are=20 > zero installation directions however (or they are very well hidden),=20= > and the online documentation also seem to be void except for some=20 > reference to debian. Could you please give me some hints as how to=20 > install this? Installation is the same as any other Python package. Either put the=20 checked-out Twisted directory on your PYTHONPATH (probably using a .pth=20= file as described on Bob's blog recently), or run "python setup.py=20 install". > About the dependencies (pyOpenSSL, pycrypto and SOAPpy) to Twisted are=20= > the once on http://undefined.org/python/pimp/ up to date, or do I need=20= > newer versions of these also? I'm pretty sure these are only dependencies if you actually intend to=20 use them. I certainly don't have SOAPpy installed, and I'm pretty sure=20= I have run Twisted without any ssl or crypto related dependencies. dp |
From: <joa...@ma...> - 2005-02-19 17:35:10
|
Bob Ippolito wrote: > > On Feb 9, 2005, at 1:59 AM, Joachim M=E5rtensson wrote: > >> I have written an app that goes through a bunch of source-files and=20 >> returns a list of tuples. This can take close to 30 seconds, during=20 >> which the interface is blocked. Can anyone give me some suggestions=20 >> on how to move forward. Should I stick to cocoa-threads since I am=20 >> using PyObjC? All the file handling is read only. I have been looking=20 >> for examples, but all that I can find shows XML-RPC that seems to=20 >> handle its own threading. Here is my current code adapted from the=20 >> WebServicesTool example. Is there someway I can easily extend this? > > > The WebServicesTool example does use threads directly. XML-RPC=20 > doesn't handle its own threading. The example you gave isn't really=20 > sufficient to give any suggestions. > > An alternative is using Twisted, which is asynchronous and provides=20 > Cocoa runloop integration (you must use Twisted from SVN though, 1.3.0=20 > doesn't work with PyObjC 1.1 and later and a patch was never=20 > released). There are also examples for that. > > -bob > Ok thanks for the help with Twisted, it now works (I had a couple of=20 extra Pythons installed for some reason). Anyway back to the subject,=20 what I want to achieve is to have a responsive interface (I want to=20 avoid the spinning beachball). Twisted seems to be what people use for=20 this kind of things. I am calling a function that returns a list of=20 tuples, this function is called multiple times with different arguments.=20 I want to append all the lists returned into one big list, that I will=20 display in a NSTableView. This is what I have so far def getMethods(self): self._methodList =3D[] self.startWorking() # Start Process indicator filelist =3DGlobDirectoryWalker(self._server, "*.m") d =3D defer.succeed([]) for filename in filelist: d.addCallback(self.receiveMethods, filename) d.addCallback(self._OrigList.extend) # This will only append the=20 placeholder list def receiveMethods(self, prev, filename): a =3D hbalance.maine(filename) # this is the function that return= s=20 the list of tuples if a : # a can be None return defer.succeed(prev + a) return defer.succeed(prev) Ok this code actually does work, however I get no benefits when it comes=20 to responsiveness. The UI still locks up during work. I guess I am doing=20 something wrong here. hbalance is currently not a class just a file with=20 function, if that makes any difference. Currently I do not use=20 reactor.callLater or anything of that, except for a reactor.run() in=20 awakeFromNib the code above is all that touch the reactor. All help=20 appreciated. Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-19 21:32:00
|
On Feb 19, 2005, at 12:35, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> >> On Feb 9, 2005, at 1:59 AM, Joachim M=E5rtensson wrote: >> >>> I have written an app that goes through a bunch of source-files and=20= >>> returns a list of tuples. This can take close to 30 seconds, during=20= >>> which the interface is blocked. Can anyone give me some suggestions=20= >>> on how to move forward. Should I stick to cocoa-threads since I am=20= >>> using PyObjC? All the file handling is read only. I have been=20 >>> looking for examples, but all that I can find shows XML-RPC that=20 >>> seems to handle its own threading. Here is my current code adapted=20= >>> from the WebServicesTool example. Is there someway I can easily=20 >>> extend this? >> >> >> The WebServicesTool example does use threads directly. XML-RPC=20 >> doesn't handle its own threading. The example you gave isn't really=20= >> sufficient to give any suggestions. >> >> An alternative is using Twisted, which is asynchronous and provides=20= >> Cocoa runloop integration (you must use Twisted from SVN though,=20 >> 1.3.0 doesn't work with PyObjC 1.1 and later and a patch was never=20 >> released). There are also examples for that. >> > Ok thanks for the help with Twisted, it now works (I had a couple of=20= > extra Pythons installed for some reason). Anyway back to the subject,=20= > what I want to achieve is to have a responsive interface (I want to=20 > avoid the spinning beachball). Twisted seems to be what people use for=20= > this kind of things. I am calling a function that returns a list of=20 > tuples, this function is called multiple times with different=20 > arguments. I want to append all the lists returned into one big list,=20= > that I will display in a NSTableView. This is what I have so far > > def getMethods(self): > self._methodList =3D[] > self.startWorking() # Start Process indicator > filelist =3DGlobDirectoryWalker(self._server, "*.m") > d =3D defer.succeed([]) > for filename in filelist: > d.addCallback(self.receiveMethods, filename) > d.addCallback(self._OrigList.extend) # This will only append=20 > the placeholder list > > def receiveMethods(self, prev, filename): > a =3D hbalance.maine(filename) # this is the function that=20 > returns the list of tuples > if a : # a can be None > return defer.succeed(prev + a) > return defer.succeed(prev) > > Ok this code actually does work, however I get no benefits when it=20 > comes to responsiveness. The UI still locks up during work. I guess I=20= > am doing something wrong here. hbalance is currently not a class just=20= > a file with function, if that makes any difference. Currently I do not=20= > use reactor.callLater or anything of that, except for a reactor.run()=20= > in awakeFromNib the code above is all that touch the reactor. All help=20= > appreciated. Sprinkling callLater and deferreds around doesn't make your code=20 non-blocking. defer.succeed does the callback *right then*, so it's=20 just a really ugly version of the code you had before. With the code you gave, I can't really make any suggestions. Where=20 does this code talk on a network? Why are you using Twisted? -bob |
From: <joa...@ma...> - 2005-02-19 22:50:08
|
Bob Ippolito wrote: > Sprinkling callLater and deferreds around doesn't make your code=20 > non-blocking. defer.succeed does the callback *right then*, so it's=20 > just a really ugly version of the code you had before. > > With the code you gave, I can't really make any suggestions. Where=20 > does this code talk on a network? Why are you using Twisted? > > -bob > I was given the impression that Twisted was the only way to use threads=20 with the PyObjC framework. I am not after any networking, My app is=20 strictly CPU and I/O-bound, there is no networking. All I want to do is=20 spin of a sub-process, so that the GUI of my app won`t be blocked,=20 ideally I want to be able to spin of another task from the menubar. It=20 seems I have confused myself with regards to the purpose of Twisted ;). What is the best way to keep responsiveness in the GUI, currently it is=20 blocked for several seconds while the for-loop repeatedly calls my CPU-=20 and file-intensive function? Is there some better way than spinning of=20 the intensive part? As you might have guessed I am a not that=20 experienced when it comes to threading. Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-19 22:59:55
|
On Feb 19, 2005, at 5:49 PM, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> Sprinkling callLater and deferreds around doesn't make your code=20 >> non-blocking. defer.succeed does the callback *right then*, so it's=20= >> just a really ugly version of the code you had before. >> >> With the code you gave, I can't really make any suggestions. Where=20= >> does this code talk on a network? Why are you using Twisted? >> > I was given the impression that Twisted was the only way to use=20 > threads with the PyObjC framework. I am not after any networking, My=20= > app is strictly CPU and I/O-bound, there is no networking. All I want=20= > to do is spin of a sub-process, so that the GUI of my app won`t be=20 > blocked, ideally I want to be able to spin of another task from the=20 > menubar. It seems I have confused myself with regards to the purpose=20= > of Twisted ;). Twisted is primarily a framework for *avoiding* threads. In the case=20 of file I/O, you're basically stuck with them because there is no=20 asynchronous way to screw around with the filesystem. Twisted does=20 allow you to deal with threads in a rather nice way with deferToThread=20= -- but if that's all you're going to use Twisted for, you might as well=20= use lower level primitives. > What is the best way to keep responsiveness in the GUI, currently it=20= > is blocked for several seconds while the for-loop repeatedly calls my=20= > CPU- and file-intensive function? Is there some better way than=20 > spinning of the intensive part? As you might have guessed I am a not=20= > that experienced when it comes to threading. Your I/O intensive stuff should happen in a thread or a separate=20 process. If you're using separate processes, Twisted is probably a=20 decent way of doing it.. but using threads in this case is probably to=20= be preferred. Looking again at the code example you gave, I really have no idea=20 what's going on. There's way too much left out, so I can't really help=20= you rewrite it using threads. The original WebServicesTool uses=20 threads, so you should look at that. I would probably have written it=20= using NSThread rather than Python's threads, but it's not effectively=20 much different. -bob |
From: <joa...@ma...> - 2005-02-19 23:40:15
|
Bob Ippolito wrote: > > Your I/O intensive stuff should happen in a thread or a separate > process. If you're using separate processes, Twisted is probably a > decent way of doing it.. but using threads in this case is probably to > be preferred. > > Looking again at the code example you gave, I really have no idea > what's going on. There's way too much left out, so I can't really > help you rewrite it using threads. The original WebServicesTool uses > threads, so you should look at that. I would probably have written it > using NSThread rather than Python's threads, but it's not effectively > much different. > > -bob > Ok thanks. I have looked at NSThread, is detachNewThreadSelector:toTarget:withObject: the method to use? It seems it does not allow any return-value, How am I supposed to get the data that is generated back to the GUI thread? |
From: Bob I. <bo...@re...> - 2005-02-19 23:45:40
|
On Feb 19, 2005, at 6:40 PM, Joachim M=E5rtensson wrote: > Bob Ippolito wrote: > >> >> Your I/O intensive stuff should happen in a thread or a separate=20 >> process. If you're using separate processes, Twisted is probably a=20= >> decent way of doing it.. but using threads in this case is probably=20= >> to be preferred. >> >> Looking again at the code example you gave, I really have no idea=20 >> what's going on. There's way too much left out, so I can't really=20 >> help you rewrite it using threads. The original WebServicesTool uses=20= >> threads, so you should look at that. I would probably have written=20= >> it using NSThread rather than Python's threads, but it's not=20 >> effectively much different. >> > Ok thanks. I have looked at NSThread, is=20 > detachNewThreadSelector:toTarget:withObject: the method to use? It=20 > seems it does not allow any return-value, How am I supposed to get the=20= > data that is generated back to the GUI thread? If it had a return value, you would be back to your original problem: =20= it blocks until the value is ready, and your GUI becomes unresponsive. =20= In order to communicate between threads without blocking, you must use=20= some other mechanism, like queues. -[NSObject=20 performSelectorOnMainThread:withObject:waitUntilDone:] is also often=20 useful for this purpose. -bob |
From: <joa...@ma...> - 2005-02-20 18:55:30
|
Bob Ippolito wrote: > If it had a return value, you would be back to your original problem: =20 > it blocks until the value is ready, and your GUI becomes=20 > unresponsive. In order to communicate between threads without=20 > blocking, you must use some other mechanism, like queues. -[NSObject=20 > performSelectorOnMainThread:withObject:waitUntilDone:] is also often=20 > useful for this purpose. > > -bob Thanks, I have borrowed threading code from the original Web Services=20 Tool. Every thing works, no blocking at all, again: Thank you! However I=20 want to update some text that is displayed just under the toolbar, just=20 as in the WST app. However everytime I call the update method my app locks, and has to be=20 force quitted. Here is the code: def setStatusTextFieldMessage_(self, aMessage): if not aMessage: aMessage =3D "Displaying information about "=20 +`len(self._methodList)` +" methods." =20 self.statusTextField.performSelectorOnMainThread_withObject_waitUntilDone= _( "setStringValue:", aMessage, 0) def reloadVisibleData_(self, sender): if self._working: # don't start a new job while there's an unfinished one return self.setStatusTextFieldMessage_("Checking ...") # This works self.startWorking() url =3D self._server self._workerThread.scheduleWork(self.getMethods, url) self.setStatusTextFieldMessage_("Found %d methods." %=20 len(self._OrigList)) =20 def getMethods(self, url): pool =3D NSAutoreleasePool.alloc().init() self._methodList =3D[] self._OrigList=3D[] self.startWorking() # Start Process indicator filelist =3DGlobDirectoryWalker(url, "*.m") for filename in filelist: self.receiveMethods(filename) ab =3D len(self._methodList) self.setStatusTextFieldMessage_("Found %d methods." % ab)=20 #This does not Again thanks a lot for all your answers so far, they have been very helpf= ul. Joachim M=E5rtensson |
From: <joa...@ma...> - 2005-02-25 03:29:39
|
Joachim M=E5rtensson wrote: > Thanks, I have borrowed threading code from the original Web Services=20 > Tool. Every thing works, no blocking at all, again: Thank you! However=20 > I want to update some text that is displayed just under the toolbar,=20 > just as in the WST app. > However everytime I call the update method my app locks, and has to be=20 > force quitted. > Here is the code: > > def setStatusTextFieldMessage_(self, aMessage): > if not aMessage: > aMessage =3D "Displaying information about "=20 > +`len(self._methodList)` +" methods." > =20 > self.statusTextField.performSelectorOnMainThread_withObject_waitUntilDo= ne_(=20 > > "setStringValue:", aMessage, 0) > > def reloadVisibleData_(self, sender): > if self._working: > # don't start a new job while there's an unfinished one > return > self.setStatusTextFieldMessage_("Checking ...") # This works > self.startWorking() > url =3D self._server > self._workerThread.scheduleWork(self.getMethods, url) > self.setStatusTextFieldMessage_("Found %d methods." %=20 > len(self._OrigList)) > def getMethods(self, url): > pool =3D NSAutoreleasePool.alloc().init() > self._methodList =3D[] > self._OrigList=3D[] > self.startWorking() # Start Process indicator > filelist =3DGlobDirectoryWalker(url, "*.m") > for filename in filelist: > self.receiveMethods(filename) > ab =3D len(self._methodList) > self.setStatusTextFieldMessage_("Found %d methods." % ab)=20 > #This does not > > Again thanks a lot for all your answers so far, they have been very=20 > helpful. Replying to my own mail, sorry. I have found the problem, I forgot to=20 make the string unicode, everything now works as it should. self.statusTextField.performSelectorOnMainThread_withObject_waitUntilDone= _( "setStringValue:", unicode(aMessage), 0) Maybe someone can explain why this is needed when using threads but not=20 otherwise? Joachim M=E5rtensson |
From: Bob I. <bo...@re...> - 2005-02-25 03:43:47
|
On Feb 24, 2005, at 10:29 PM, Joachim M=E5rtensson wrote: > Joachim M=E5rtensson wrote: > >> Thanks, I have borrowed threading code from the original Web Services = =20 >> Tool. Every thing works, no blocking at all, again: Thank you! =20 >> However I want to update some text that is displayed just under the =20= >> toolbar, just as in the WST app. >> However everytime I call the update method my app locks, and has to =20= >> be force quitted. >> Here is the code: >> >> def setStatusTextFieldMessage_(self, aMessage): >> if not aMessage: >> aMessage =3D "Displaying information about " =20 >> +`len(self._methodList)` +" methods." >> =20 >> = self.statusTextField.performSelectorOnMainThread_withObject_waitUntilD=20= >> one_( >> "setStringValue:", aMessage, 0) >> >> def reloadVisibleData_(self, sender): >> if self._working: >> # don't start a new job while there's an unfinished one >> return >> self.setStatusTextFieldMessage_("Checking ...") # This works >> self.startWorking() >> url =3D self._server >> self._workerThread.scheduleWork(self.getMethods, url) >> self.setStatusTextFieldMessage_("Found %d methods." % =20 >> len(self._OrigList)) > > >> def getMethods(self, url): >> pool =3D NSAutoreleasePool.alloc().init() >> self._methodList =3D[] >> self._OrigList=3D[] >> self.startWorking() # Start Process indicator >> filelist =3DGlobDirectoryWalker(url, "*.m") >> for filename in filelist: >> self.receiveMethods(filename) >> ab =3D len(self._methodList) >> self.setStatusTextFieldMessage_("Found %d methods." % ab) =20= >> #This does not >> >> Again thanks a lot for all your answers so far, they have been very =20= >> helpful. > > Replying to my own mail, sorry. I have found the problem, I forgot to =20= > make the string unicode, everything now works as it should. > = self.statusTextField.performSelectorOnMainThread_withObject_waitUntilDo=20= > ne_( > "setStringValue:", unicode(aMessage), 0) > > Maybe someone can explain why this is needed when using threads but =20= > not otherwise? You *should* be doing it 100% of the time. I'm not sure why it creates =20= a problem here, specifically.. something to do with the timing of the =20= release or the identity change I guess. *Maybe* a GIL problem... If =20 you can reduce it to a minimal example that reproduces this issue, then =20= I'm sure someone will diagnose it. -bob |