首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread:线程仍在运行时被销毁:如何在QTimers中正确使用QThreads?

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

Stack Overflow用户
提问于 2022-06-02 11:15:06
回答 1查看 194关注 0票数 1

我有点难以理解下面的测试代码中发生了什么。

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

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

代码语言:javascript
复制
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())

主要应用屏幕截图:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 14:22:50

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

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

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

代码语言:javascript
复制
def __del__(self):
    self.timer.stop()
    self.thread.quit()

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

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

代码语言:javascript
复制
    self.timer = QTimer(self)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72475338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档