Hi guys,

Tried get_pt().setDaemon(True)...
This seemed to make no difference what so ever.  Maya is still
randomly leaving 1 thread open.

So with no other option.  I've added a scriptJob to pumpThread.  This
has helped reduce the amount of times the thread is left open.
Happens about half the time now.  But it's still a problem.  So, what
else can I do?  It's seems that I'll have to write a service to check
for a Maya application with just 1 thread.  Then manually kill the
thread.

Alternatively I could do this as a python script when maya starts/or
closes.  Anybody know of a way to "kill a process tree" from default
python?

-Dave


On Sep 16, 10:37 pm, David Moulder <[email protected]> wrote:
> Hmm.  1st I've heard of daemonic.  I'll give it a go tomorrow.
>
> Cheers
>
> -Dave
>
> On Wed, Sep 16, 2009 at 2:52 PM, Chris G <[email protected]> wrote:
>
> > Have you tried setting Thread.deamon / Thread.setDaemon() ?
> > If the thread is not daemonic, it may block python finalization.
>
> > -Chris
>
> > On Wed, Sep 16, 2009 at 6:25 AM, thirstydevil <[email protected]>
> > wrote:
>
> > > I've noticed a few issues using PyQt and pumpThread.  It seems that
> > > randomly when users closes Maya it will do 1 of these:
>
> > > 1) Close successfully.
> > > 2) Not closes. Instead require 2 close requests by the user.
> > > 3) Closes but leaves 1 Maya thread running ( the pumpThread ) and
> > > still consuming Maya's memory footprint
>
> > > In an attempt to understand the problem I've reconfigured pumpThread
> > > based on Jon's and another user's version posted here (can't remember
> > > who and cant be bothered to hunt for it again, sorry to who ever you
> > > are).  I'll blat out my thoughts and you guys can hopefully correct me
> > > or confirm my understanding.
>
> > -----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> > > I've not done any multi threading stuff before, but this is what I
> > > understand is happening with pumpThread and the way in which it's
> > > operating.
>
> > > pumpThread is spawning 1 sub thread from Maya's main thread.  The UI
> > > is executing in that new thread.
> > > threading.Thread( target = pumpQt, args = () )
>
> > > Whenever a maya cmd is called in the PyQt UI code it is called with
> > > utils.executeDeferred( processor ) in pumpQt block.
>
> > > This intern is executed in maya's main thread when it can.  I simply
> > > added the following line to the pumpQt whille loop print "pump..."
> > > makes sure a maya cmd is called every pumpThread cycle.
>
> > > As this loop is executing quicker than maya's main loop and stack of
> > > evalDeffered print statements build up in the main thread.  In my
> > > pumpThread module I've created a global for the while loop (gPump).
> > > Using killPumpThread I can instantly stop and close the thread.  But
> > > Maya is still printing "pump..." untill the stack of evalDeffered cmds
> > > have finished.
>
> > > Here's my test code with my new pumpThread module
>
> > > import pumpThread
> > > pumpThread.initializePumpThread()
> > > # Wait 20 secs
> > > pumpThread.killPumpThread()
> > > # only a small number of prints executed after thread is closed. Maybe
> > > 2-5 cycle depending
>
> > > # Load my PyQt UI and leave open and pumping for 20secs
> > > pumpThread.killPumpThread()
> > > # window closes quickly and tread die's in Task Manager.  But 926
> > > lines of pump... printed  before maya is finished
>
> > > So how does that relate to the 3 errors above?
>
> > > 1) Close successfully.
> > > Thread has closed in time and Maya has no evaldeffers in the stack
>
> > > 2) Not closes. Instead require 2 close requests by the user.
> > > Thread has closed in time but maya is still pumping
>
> > > 3) Closes but leaves 1 Maya thread running ( the pumpThread ) and
> > > still consuming Maya's memory footprint
> > > Thread didn't close, UI could have been left open or maya not closing
> > > sun threads properly?
>
> > > It seems I can't do anything about error 2  as this is down to how
> > > much and often the threads are communicating.  But I can help on error
> > > 3 by calling pumpThread.killPumpThread() with a script job on Maya
> > > exit.
>
> > > "RANT ON"
> > > I've spent nearly 6 months researching PyQt in Maya and so far
> > > (especially if you are having to support 64bit) I have to say it's
> > > allot of pain to maintain.  Maya doesn't play nicely and will crash
> > > with no warning if you try to do something wrong or something it's not
> > > happy with.  When you have 12 UI modules and 500 - 3000 lines of code
> > > in each it is a real headache to comment out blocks of code to find
> > > the line that is crashing Maya.  Sometimes it's not you.  I had one
> > > example where by I was creating a QIcon as a module global, it was
> > > being used allot in the UI.  This line had been in for months, but all
> > > of a sudden was crashing Maya.  I had to put the QIcon inside a class
> > > to solve the Maya crash.  Developing a complex UI as I have with PyQT
> > > with lots of dependencies on Maya tools, like Pymel and clr means that
> > > you loose the ability to run the UI in Wings with debugging.
> > > Something you really need.  Instead. I think using C++ Qt would give
> > > you the hooks to run in debug mode with Maya.  You wouldn't have to
> > > compile 64bit PyQt as well.  But then you loose the benefits of
> > > developing in a scripting environment.
> > > "RANT OFF"
>
> > > I'm sure that other studios trying to implement PyQT into there
> > > pipeline have faced these issues.  I was wondering if anyone else
> > > could shed some light of the pit falls and hoops you are jumping
> > > through.
>
> > > Anyway here is my edited pumpThread module
>
> > > -Dave
>
> > ----------------------------------------------------------------------------------------------------------------------------------------------------------
>
> > > from PyQt4 import QtCore, QtGui
> > > import maya.utils as utils
> > > import sys
> > > import time
> > > import threading
> > > import gc
> > > import maya.cmds as cmds
>
> > > pumpedThread = None
> > > app = None
> > > gPump = True
>
> > > def get_app():
> > >        global app
> > >        return app
>
> > > def set_app(i_app):
> > >        global app
> > >        testAppInstance = QtCore.QCoreApplication.instance()
> > >        if testAppInstance:
> > >                app = testAppInstance
> > >        else:
> > >                app = i_app
>
> > > def get_pt():
> > >        global pumpedThread
> > >        return pumpedThread
>
> > > def set_pt(i_pt):
> > >        global pumpedThread
> > >        pumpedThread = i_pt
>
> > > def pumpQt():
> > >        global app
> > >        global gPump
> > >        def processor():
> > >                app.processEvents()
> > >        while gPump:
> > >                time.sleep(0.01)
> > >                utils.executeDeferred( processor )
> > >                #print "pump..."
>
> > > def killProcess():
> > >        global gPump
> > >        gPump = False
>
> > > def killPumpThread():
> > >        if get_app():
> > >                get_app().closeAllWindows()
> > >        if get_pt():
> > >                killProcess()
> > >                set_pt(None)
> > >                set_app(None)
> > >                gc.collect()
>
> > > class QThreader(QtCore.QThread):
> > >        '''An attempt to use QThread instead of Threading.  Counld get
> > > this to pump in the same fasion'''
> > >        def __init__(self, funcPointer, executeDeferred=True):
> > >                super(QThreader, self).__init__()
> > >                self.runThread = True
> > >                self.funcPointer = funcPointer
> > >                self.executeDeferred = executeDeferred
>
> > >        def run(self):
> > >                time = long(1)
> > >                while self.runThread:
> > >                        self.usleep(time)
> > >                        if self.executeDeferred:
> > >                                utils.executeDeferred(self.funcPointer())
> > >                        else:
> > >                                self.funcPointer()
>
> > >        def killThread(self):
> > >                self.runThread=False
>
> > >        def startThread(self):
> > >                self.runThread=True
>
> > > def initializePumpThread():
> > >        global gPump
> > >        gPump = True
> > >        if get_pt() == None:
> > >                set_app(QtGui.QApplication(sys.argv))
> > >                set_pt(threading.Thread( target = pumpQt, args = () ))
> > >                get_pt().start()
>
>
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/python_inside_maya
-~----------~----~----~----~------~----~------~--~---

Reply via email to