我想在我的應用程序中有2個工作線程。一加載GUI就應該開始運行,另一個應該稍後由某個信號啓動。假設這是一個按鈕點擊。Python在PyQt5應用程序中崩潰的2個工作線程
當我的Python解釋器在執行第二個線程時崩潰了(如顯示Windows錯誤「Python停止工作」,沒有堆棧跟蹤),我遇到了一個奇怪的行爲。
下面是一個例子,點擊按鈕後會立即崩潰。
class Worker(QtCore.QThread):
def __init__(self, method_to_run):
super().__init__()
self.method = method_to_run
def run(self):
self.method()
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.button = QPushButton('Test', self)
self.label = QLabel(self)
self.button.clicked.connect(self.handleButton)
layout = QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.button)
self.worker = Worker(self.test_method)
self.worker.start()
def handleButton(self):
self.label.setText('Button Clicked!')
worker = Worker(self.test_method)
worker.start()
@staticmethod
def test_method():
res = [i*i for i in range(100500)]
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
更奇怪的是,當您出於某種原因調試應用程序時,它不會崩潰。
我在這裏錯過了什麼?
編輯 我可以從crashdump得到很多,因爲我沒有QT的符號。但它看起來像QtCore.dll內發生崩潰
ExceptionAddress: 00000000632d4669 (Qt5Core!QThread::start+0x0000000000000229)
您可以包含堆棧跟蹤嗎? – tdelaney
好吧,我的Python解釋器崩潰,出現一個Windows錯誤「Python.exe停止工作」我將嘗試分析崩潰轉儲,但它不會有幫助,因爲我沒有調試符號。沒有Python堆棧跟蹤,因爲解釋器崩潰了...... –
注意:如果這是純粹的Py3代碼,爲簡單起見,可以使用no-arg'super'。 'super(Window,self).__ init __()'只在Py2中需要,在Py3中,'super().__ init __()'更乾淨,更快,行爲相同(除非你做了一些糟糕的事情,在定義它之後在全球範圍內)。 – ShadowRanger