0
當我在下面的'minimal'示例中將啓動QThread的函數更改爲'_do_print2'時,我的MainWindow凍結。爲了比較,上面的按鈕將啓動QThread,沒有任何問題。爲什麼線程是MainWindow類的子對象?如果線程不是主線程的子對象,爲什麼我的Qt應用程序會凍結?
我使用Python 2.7.6和Qt 4.8.6。
from PyQt4 import QtCore, QtGui
import sys, time
class MainWindow(QtGui.QDialog):
def __init__(self):
super(self.__class__, self).__init__()
self.verticalLayout = QtGui.QVBoxLayout(self)
self.pushButton = QtGui.QPushButton()
self.pushButton2 = QtGui.QPushButton()
self.verticalLayout.addWidget(self.pushButton)
self.verticalLayout.addWidget(self.pushButton2)
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('clicked()'), self._do_print)
QtCore.QObject.connect(self.pushButton2, QtCore.SIGNAL('clicked()'), self._do_print2)
## Working function
def _do_print(self):
self.thread = Worker(printer)
self.thread.start()
## Function freezes the MainWindow
def _do_print2(self):
thread = Worker(printer)
thread.start()
def printer():
while True:
print "alive"
time.sleep(1)
class Worker(QtCore.QThread):
def __init__(self, function, *args, **kwargs):
super(self.__class__, self).__init__()
self.args = args
self.kwargs = kwargs
self.function = function
def run(self):
self.function(*self.args, **self.kwargs)
return
def __del__(self):
self.wait()
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
所以垃圾收集器想要刪除工作線程,是第一個線程('窗口'在其中運行)的一部分,但必須等待其刪除,並因此阻止其線程。對? –
@ JohnH.K。不,它是線程的'wait()',可以防止立即刪除。看到我答案的最後一句話。 – ekhumoro
我的意思是功能wait()'必須等待'。但是這個函數在工作對象中,而不在主窗口對象中。主線程想要使用worker的self .__ del__函數 - 正確嗎? –