【问题标题】:pyqt5 qthread crash for unkown reason,how to use it correctly?pyqt5 qthread 未知原因崩溃,如何正确使用?
【发布时间】:2019-04-02 01:51:27
【问题描述】:

我是 pyqt5 的新手,我发现一个我无法解释的问题

首先,当我尝试以自己的方式解决这个问题时,我认为我应该直接使用 QObject 而不是 Qthread,但我只是好奇为什么会发生这种情况

如果我使用Qthread(self),程序可以正常工作,但是如果我使用Qthread(),不要将self传递给Qthread parent,程序会崩溃。 这不奇怪,奇怪的是我使用了Qthread(),并添加了一行time.sleep(0.1),代码也可以正常工作,我不知道为什么,谁能解释一下。

我用 Python 很多,但是 pyqt5 是新手,而且它的代码是 C++ 的,我无法阅读源代码来找到原因。 这是我的代码:

from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout
from PyQt5.QtCore import QThread
import sys
import time
import threading


class MyThread(QThread):
    def run(self):
        print('working', threading.current_thread())


class MyHelper(QWidget):

    def __init__(self):
        super(MyHelper, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.submit_button = QPushButton('submit')
        self.submit_button.clicked.connect(self.click_op)
        self.my_grid = QGridLayout()
        self.my_grid.addWidget(self.submit_button, 1, 1)
        self.setLayout(self.my_grid)
        self.setGeometry(300, 300, 350, 300)
        self.show()

    def click_op(self):
        '''
            my_sender = MyThread()  crash
            my_sender = MyThread(self) OK
            my_sender = MyThread() + time.sleep(0.1) OK, most weild one
        '''
        my_sender = MyThread()
        # my_sender = MyThread(self)
        my_sender.start()
        time.sleep(0.1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    email_helper = MyHelper()
    exit(app.exec_())

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

    局部变量在函数结束时自动销毁,将my_sender声明为类变量

    self.my_sender = MyThread()
    self.my_sender.start()
    

    【讨论】:

    • 这是有道理的,但这是一个简化的例子,让我在现实世界的例子中测试一下
    • 这是微妙的,当我使用threading.thread时,我没有发现这个问题,它们之间有什么区别?
    • 对不起,我无法回答你的问题,因为我不知道它们的结构
    • @Tarjintor python threading 模块维护对所有Thread 实例的弱引用的内部缓存。在 qt 中,没有自动管理 QThread 实例,因此您必须自己设置父级或显式保留引用。
    • @Tarjintor 实际上,threading 模块还保留了其他几个不使用弱引用的内部线程缓存。不过,似乎没有任何官方文档 - 这只是一个实现细节。如果您想了解更多信息,建议您查看module source code
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2013-04-09
    • 1970-01-01
    • 2021-06-11
    • 2019-05-27
    • 2023-01-30
    • 2013-08-10
    相关资源
    最近更新 更多