鱼C论坛

 找回密码
 立即注册
查看: 1506|回复: 2

关闭应用程序时,报类对象已经deleted的错误

[复制链接]
发表于 2020-4-5 21:10:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jsc_wu 于 2020-4-7 09:11 编辑

各位大神,
        本人基于pyqt5设计了一个界面,还自定义了一个类VideoPorcessor,在类里面定义了析构函数__del__(self),然后在界面初始化函数里面用类VideoPorcessor定义了一个对象。程序正常运行后,当关闭界面退出程序时,报类对象已经deleted的错误。如下图所示:
析构函数:
    def __del__(self):
        print("%s, line=%d, del object" % (__name__, sys._getframe().f_lineno))
        self.wait()
报错:
Exception ignored in: <function VideoPorcessor.__del__ at 0x0000000014531510>
Traceback (most recent call last):
  File "E:\gititt-dap\itt-dap\vp-2.0\Video_process.py", line 46, in __del__
RuntimeError: wrapped C/C++ object of type VideoPorcessor has been deleted

我程序里面没有手动去调用析构函数,都是Python自己默认调用的,为什么会报这样的错误???
谢谢!
之前没有描述清楚,下面我再描述一下:
类VideoPorcessor定义如下:
class VideoPorcessor(QThread):
       def __init__(self):
             super(VideoPorcessor, self).__init__()
             .....
       def run(self):
            try:
                self.handle = ctypes.windll.kernel32.OpenThread(  # @UndefinedVariable
                      win32con.PROCESS_ALL_ACCESS, False, int(QThread.currentThreadId()))
            except Exception as e:
                logger_processThread.error('get thread handle failed', e)
如上所述,定义了一个继承QThread的类,所以在析构函数里面才会有self.wait()。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-5 21:21:47 | 显示全部楼层
你这个析构函数调用了已经被回收的东西了吧。因为过了生命周期内存会自动回收了~是python特性~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 09:08:45 | 显示全部楼层
dlnb526 发表于 2020-4-5 21:21
你这个析构函数调用了已经被回收的东西了吧。因为过了生命周期内存会自动回收了~是python特性~

你好!,你是指self.wait()吗?这个是我为了等待线程结束,才加的。这样子有问题吗?之前没有阐述清楚,下面我再描述一下:
class VideoPorcessor(QThread):
       def __init__(self):
             super(VideoPorcessor, self).__init__()
             .....
       def run(self):
            try:
                self.handle = ctypes.windll.kernel32.OpenThread(  # @UndefinedVariable
                      win32con.PROCESS_ALL_ACCESS, False, int(QThread.currentThreadId()))
            except Exception as e:
                logger_processThread.error('get thread handle failed', e)
如上所述,定义了一个继承QThread的类,所以在析构函数里面才会有self.wait()。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表