Wednesday 15 August 2012

python - Multiple QThread keep crashing PySide -



python - Multiple QThread keep crashing PySide -

i trying implement programme multiple threads. in __init__ of main window, threads created. gui starts up, while threads run in background. problem keeps crashing. if add/uncomment line print statement, programme works fine.

class testthreadingwin(qtgui.qmainwindow): def __init__(self, parent=rsui.getmayamainwindow()): ''' constructor ''' super(testthreadingwin, self).__init__(parent) self.setwindowtitle('test threading') self.centralwidget = qtgui.qplaintextedit() self.setcentralwidget(self.centralwidget) self.centralwidget.appendplaintext("test") numthreads = 7 self._threads = [] in range(numthreads): #print self._threads # <-- uncomment line, , works?! testthread = qtcore.qthread() # maintain reference thread object or deleted when # goes out of scope, if has not finished processing. self._threads.append(testthread) worker = testthreadworker(i) worker.movetothread(testthread) worker.finishedprocessing.connect(self.updatestuff) worker.finishedprocessing.connect(testthread.quit) testthread.started.connect(worker.dostuff) testthread.finished.connect(self.deletethread) testthread.start() qtcore.qcoreapplication.processevents() print 'done creating threads' def deletethread(self): """ destroy thread object , remove reference self._threads list. """ print 'delete thread' threadtodelete = self.sender() threadindex = self._threads.index(threadtodelete) del self._threads[threadindex] threadtodelete.deletelater() def updatestuff(self, message): self.centralwidget.appendplaintext(message) class testthreadworker(qtcore.qobject): finishedprocessing = qtcore.signal(str) def __init__(self, num): super(testthreadworker, self).__init__() self._num = num def dostuff(self): time.sleep(1) choicelist = ['cat', 'bat', 'hat', 'tissue', 'paper', 'qwerty', 'mouse'] stuff = random.choice(choicelist) stuff2 = '{0} {1}'.format(self._num, stuff) self.finishedprocessing.emit(stuff2) def openthreadingwin(): '''this ensures 1 instance of ui open @ time.''' global testingthreadingwin try: testingthreadingwin.close() testingthreadingwin.deletelater() except: pass testingthreadingwin = testthreadingwin() testingthreadingwin.show()

it weird print statement create stop crashing. overlooking?

i got working using qthreadpool. manages threads me, don't have worry trying access destroyed. key differences:

the worker class inherits both qtcore.qobject , qtcore.qrunnable. (it has inherit qobject in order emit signal.) __init__ function of both parent classes must called, or programme crash. no more code set connections ensure thread destroyed when done. no more code maintain references threads or delete references when thread destroyed.

here new code:

class testthreadpoolwin(qtgui.qmainwindow): def __init__(self, parent=rsui.getmayamainwindow()): ''' constructor ''' super(testthreadpoolwin, self).__init__(parent) self.setwindowtitle('test threading') self.centralwidget = qtgui.qplaintextedit() self.setcentralwidget(self.centralwidget) self.centralwidget.appendplaintext("test") numthreads = 7 threadpool = qtcore.qthreadpool.globalinstance() in range(numthreads): runnable = testrunnableworker(i) runnable.finishedprocessing.connect(self.updatestuff) threadpool.start(runnable) print 'done creating threads' def updatestuff(self, message): self.centralwidget.appendplaintext(message) class testrunnableworker(qtcore.qobject, qtcore.qrunnable): finishedprocessing = qtcore.signal(str) def __init__(self, num, parent=none): # sure run __init__ of both parent classes, or else # crash. qtcore.qobject.__init__(self, parent) qtcore.qrunnable.__init__(self) self._num = num def run(self): time.sleep(1) choicelist = ['cat', 'bat', 'hat', 'tissue', 'paper', 'qwerty', 'mouse'] stuff = random.choice(choicelist) stuff2 = '{0} {1}'.format(self._num, stuff) self.finishedprocessing.emit(stuff2) def openthreadpoolwin(): '''this ensures 1 instance of ui open @ time.''' global testingthreadpoolwin try: testingthreadpoolwin.close() testingthreadpoolwin.deletelater() except: pass testingthreadpoolwin = testthreadpoolwin() testingthreadpoolwin.show()

python pyside qthread

No comments:

Post a Comment