Я пытаюсь реализовать программу с несколькими потоками. В окне __init__
главного окна создаются потоки. GUI запускается, а потоки запускаются в фоновом режиме. Проблема в том, что он продолжает терпеть крах. Но если я добавлю/раскомментирую строку с заявлением о печати, программа отлично работает.Несколько QThread продолжают сбой PySide
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 = []
for i in range(numThreads):
#print self._threads # <-- Uncomment this line, and it works?!
testThread = QtCore.QThread()
# Keep a reference to the thread object or it will be deleted when
# it goes out of scope, even if it 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 all threads'
def deleteThread(self):
""" Destroy the thread object and remove the reference to it from the
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 that only one instance of the UI is open at a time.'''
global testingThreadingWin
try:
testingThreadingWin.close()
testingThreadingWin.deleteLater()
except: pass
testingThreadingWin = TestThreadingWin()
testingThreadingWin.show()
Странно, что заявление о печати заставит его остановиться. Что я не замечаю?
Что значит 'он выходит из строя' означает, точно? – aruisdante
Я запускаю этот код в Maya. Это сбой майи. Майя просто закрывает меня без предупреждения. –