jsc_wu 发表于 2020-4-5 21:10:24

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

本帖最后由 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()。

dlnb526 发表于 2020-4-5 21:21:47

你这个析构函数调用了已经被回收的东西了吧。因为过了生命周期内存会自动回收了~是python特性~

jsc_wu 发表于 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()。
页: [1]
查看完整版本: 关闭应用程序时,报类对象已经deleted的错误