当GUI被销毁时,在PySide中杀死QThread

时间:2014-09-23 18:50:05

标签: python multithreading qt pyside qthread

我正在创建一个滑块,根据从中心点拖动的距离来“扭曲”值。我想通过使用踏板进行翘曲来正确地做到这一点。这是我实际计时的主题:

class WarpThread(QtCore.QThread):
    errorHappened = False

    # This will be a semaphore used to wake up the warper thead when the slider
    # is being manipulated. It starts at 0. Upon sliderPressed, it is set to +1.
    # when the slider is released, it is set -1 again. The thread then will
    # wait on the semiphore till it is > 0. When it is, it steps up our value,
    # sleeps and then waits again
    doWarp = None

    updateWarp = Signal()
    def __init__(self, parent = None):
        super(WarpThread, self).__init__(parent)
        self.exiting = False
        self.doWarp = QtCore.QSemaphore(0)

    def run(self):
        while True:
            self.doWarp.acquire()
            if self.exiting:
                break
            self.updateWarp.emit()
            self.doWarp.release()
            QtCore.QThread.msleep(50)

    # === External function calls ===
    def startWarping(self):
        self.doWarp.release() # Allow the thread to start looping

    def stopWarping(self):
        self.doWarp.acquire()

    def stopThread(self):
        self.exiting = True
        self.doWarp.release()
        self.wait()

因此,Warp Slider只在收到信号startWarping时拨打sliderPressed,在收到stopWarping时拨打sliderReleased。一切都很好。计划是在具有滑块的东西stopThread内调用__del__。好吧,当我在没有做任何事情的情况下关闭GUI时,它会很好地关闭。当我使用滑块后退出时,出现QThread: Destroyed while thread is still running错误。我试图让线程不是滑块的父线程(认为Qt可能会通过继承树销毁它),但这似乎没有做任何事情。所以我想我不明白线程何时被销毁。

Qt是否会破坏不在x-ed输出GUI的整个父子树中的对象? 为什么不使用该线程停止小部件__del__中的线程似乎有效? 为什么使用东西后只会出现问题?

如果您有有用的链接,请将其留在评论中。我很难找到答案,因为我缺乏有效搜索的词汇

修改

此外,我知道一些建议只是让线程全局以确保它们不会被杀死,但是每个滑块都有一个线程......也许这就是需要改变的设计点...继续

0 个答案:

没有答案