簡體   English   中英

這個子類化QThread vs moveToThread示例需要解釋

[英]explanation needed for this subclassing QThread vs moveToThread example

我正在嘗試在GUI之外創建一個新的線程工作者。 當我將QThread子類化時,它按預期工作,GUI不受影響。 當我使用moveToThread技術時,我完全鎖定了GUI。 我假設我不小心將新線程放入主線程,但我不明白我正在做什么導致這一點。 如何在不凍結主線程的情況下使start2功能正常工作?

from PySide import QtGui, QtCore
import sys
import time

class THREAD(QtCore.QThread):
    def __init__(self):
        super(THREAD, self).__init__()

    def run(self):
        time.sleep(5)
        print "done"

class WORKER(QtCore.QObject):
    def __init__(self):
        super(WORKER, self).__init__()

    def run(self):
        time.sleep(5)
        print "done"

class GUI(QtGui.QDialog):
    def __init__(self):
        super(GUI, self).__init__()

        mainLayout = QtGui.QHBoxLayout()
        self.setLayout(mainLayout)
        start1Button = QtGui.QPushButton("Start1")
        start2Button = QtGui.QPushButton("Start2")
        mainLayout.addWidget(start1Button)
        mainLayout.addWidget(start2Button)
        start1Button.clicked.connect(self.start1)
        start2Button.clicked.connect(self.start2)

    def start1(self):
        self.myThread = THREAD()
        self.myThread.start()

    def start2(self):
        myWorker = WORKER()
        myThread = QtCore.QThread()
        myThread.start()
        myWorker.moveToThread(myThread)
        myWorker.run()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = GUI()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

首先,您需要保留引用您創建的worker和thread,否則只要start2()返回它們就會被垃圾收集。

其次,直接在start2()內調用myWorker.run()意味着它將在主線程中執行。 因此,您必須安排在線程啟動后稍后調用它。 通常的方法是使用信號。

因此,您的代碼應如下所示:

    def start2(self):
        self.myWorker = WORKER()
        self.myThread2 = QtCore.QThread()
        self.myWorker.moveToThread(self.myThread2)
        self.myThread2.started.connect(self.myWorker.run)
        self.myThread2.start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM