为什么在按下QPushButton时仍会阻止多线程

时间:2019-06-05 05:34:18

标签: python python-3.x multithreading qthread pyside2

我遵循了有关使用PyQt在python中进行线程化的教程,但仍然受阻。任何人都可以澄清原因。可能是我没有意识到的事情。我有以下代码:

def blocker():
    i = 0
    while True:
        i = i + 1

class CustomThread(QThread):
    def __init__(self):
        QThread.__init__(self)
    def __del__(self):
        self.wait()
    def run(self):
        self.emit(SIGNAL('update_log(QString)'), "Running Thread")
        blocker()

class Form(QObject):

    def __init__(self, ui_file, parent=None):
        super(Form, self).__init__(parent)
        ui_file = QFile(ui_file)
        ui_file.open(QFile.ReadOnly)

        loader = QUiLoader()
        self.window = loader.load(ui_file)
        ui_file.close()
        generate_btn = self.window.findChild(QPushButton, 'generate_btn')
        generate_btn.clicked.connect(self.generate_handler_clicked)
        self.window.show()

    def done(self):
        log = self.window.findChild(QTextBrowser, 'log_browser')
        log.setText("Done...\n" + log.toPlainText())

    def update_log(self, update_text):
        log = self.window.findChild(QTextBrowser, 'log_browser')
        log.setText(update_text + "\n" + log.toPlainText())

    def generate_handler_clicked(self):
        log = self.window.findChild(QTextBrowser, 'log_browser')
        log.setText("Button clicked\n" + log.toPlainText())
        my_thread = CustomThread()
        self.connect(my_thread, SIGNAL("update_log(QString)"), self.update_log)
        self.connect(my_thread, SIGNAL("finished()"), self.done)
        my_thread.start()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form('uifile.ui')
    sys.exit(app.exec_())

按下生成按钮时,应用程序挂起,而不是在单独的线程上运行。

更新:
我遇到了另一个教程,该教程在两行中做了一些不同的工作,似乎可以正常工作。我不确定这是否是最佳做法,以及为什么会奏效,对于其他可能会觉得有用的人来说,这是否会有所澄清。

我更改了以下内容:

# the following changes in this part of the CustomThread Class
class CustomThread(QThread):
    def __init__(self): # ===> becomes def __init__(self, parent=None)
        QThread.__init__(self) # ===> becomes QThread.__init__(self, parent)
        ...

# and where we call the thread in the following function changes to
def generate_handler_clicked(self):
        ...
        my_thread = CustomThread() # ===> becomes my_thread = CustomThread(parent=self.window)
        ...

现在可以正常运行了,但没有完全挂起或出现问题,但还不完全了解为什么在窗口中固定修复了它们。

更新:
以下answer解释了正在发生的事情,但在发布此问题之前最初并未出现在建议中。

0 个答案:

没有答案