具有QThread用法的Enigmatic TypeError

时间:2011-09-19 20:39:16

标签: python multithreading pyqt

我有一个运行的QThread,但通常需要被杀死,然后重新创建。问题是我得到一个无法追踪的TypeError弹出,我不知道是什么导致它。我认为我没有正确地退出线程或正确地破坏它或者有些愚蠢,但我只是不知道是什么导致它。这是一些代码片段:

以下是代码:

class getHistory(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.killSwitch = 0

    def kill(self):
        self.killSwitch = 1
        self.wait()

    def run(self):
        try:
            for x in theloop:
                hist = QTreeWidgetItem()
                hist.data = dataStuff
                self.emit(SIGNAL('histItem'), hist)
                if self.killSwitch == 1: break                
        except: pass
        self.emit(SIGNAL('string'), 'done')
        return

class Main(QtGui.QMainWindow):
    def __init__(self, args):
        QtGui.QMainWindow.__init__(self)
        self.runTheThread()

    def doFunction(self, string):
        if not string == 'done':
            doThreadStuff
        else:
            doFinishedThreadStuff

    def runTheThread(self):
        self.theThread= getHistory()
        self.connect(self.theThread, QtCore.SIGNAL("string"), self.doFunction)
        self.theThread.start()

然后在循环之前尝试杀死它,我用 self.theThread.kill()

杀死了线程

杀死线程的所有正确的事情似乎都在发生,除非,如果线程被杀死并重新启动得足够快,我将得到一个无法追踪的错误:

TypeError:doFunction()只需要2个参数(给定1个)

另外,在一个稍微相关的说明中,通过发出由 doFunction 拾取的“完成”之类的字符串来检查线程是否完成是明智/智能/正确的,或者是有更好的方法吗?

由于doFunction是Qt应用程序的一部分,因此两个参数是self,string。代码一直有效,直到它被垃圾邮件发送,真的,只有这样才会出现错误。

提前致谢。

1 个答案:

答案 0 :(得分:2)