繁体   English   中英

QThread:在线程仍在运行时被销毁:如何正确使用 QThreads 和 QTimers?

[英]QThread: Destroyed while thread is still running: How to proper use QThreads with QTimers?

我在理解以下测试代码中发生了什么有点麻烦。

我创建了一个将进入线程的计时器。 该线程可以在对象内停止,但是当部署在主 QT 应用程序中时,该线程会在主应用程序结束时以某种方式获得垃圾收集。

问:如何在主应用程序结束之前正确停止QThread。(或者以更好的方式实现线程?)

import sys

from PySide6.QtCore import QTimer, Qt, QThread
from PySide6.QtWidgets import QWidget, QApplication, QLabel, QHBoxLayout

class Counter(QWidget):
    def __init__(self):
        super().__init__()

        self.cnt = 0

        self.timer = QTimer()
        self.timer.timeout.connect(self.__update_by_timer)

        self.label = QLabel()
        self.label.setText(str(self.cnt))

        self._layout = QHBoxLayout()
        self._layout.addWidget(self.label,  Qt.AlignCenter)
        self.setLayout(self._layout)

        self.timer.start(1000)
        self.thread = QThread()
        self.timer.moveToThread(self.thread)
        self.thread.start(QThread.Priority.LowestPriority)


    def __del__(self):
        self.thread.exit()

    def __update_by_timer(self):
        self.cnt += 1
        self.label.setText(str(self.cnt))

if __name__ == "__main__":

    app = QApplication(sys.argv)
    cnt = Counter()
    cnt.show()
    sys.exit(app.exec())

主应用截图:

在此处输入图像描述

我找到了我的问题的答案,

问题:如果您单击应用程序窗口,将不会调用“计数器”对象的析构函数,因此线程中的计时器与 GUI 应用程序有些距离。

为了克服这个问题,我包含了一个析构函数,它停止计时器并关闭线程。 这必须由必须从 QWidget 类派生的“closeEvent”方法调用。

def __del__(self):
    self.timer.stop()
    self.thread.quit()

def closeEvent(self, event: QCloseEvent) -> None:
    ''' Derived method from QWidget '''
    self.__del__()
    super().closeEvent(event)

原始代码中的一个额外警告是计时器本身。 这必须先采用父级的“计数器”类,然后才能在析构函数中停止。

    self.timer = QTimer(self)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM