2015-08-06 3 views
0

Я хотел бы сделать некоторые операции очистки внутри объекта непосредственно перед его уничтожением. В этом случае будет закрыто соединение с базой данных.Как вызвать функцию, когда объект QObject должен быть уничтожен?

Вот то, что я уже делаю:

Рабочий класс:

from PyQt5 import QtCore 
from pymongo import MongoClient, ASCENDING 
from time import sleep 

class StatusWidgetWorker(QtCore.QObject): 

    ongoing_conversions_transmit = QtCore.pyqtSignal([list]) 

    def __init__(self, mongo_settings): 
     super().__init__() 
     print("StatusWidget Worker init") 
     mongo_client = MongoClient([mongo_settings["server_address"]]) 
     self.log_database = mongo_client[mongo_settings["database"]] 
     self.ongoing_conversions = mongo_settings["ongoing_conversions"] 

    def status_retriever(self): 
     print("mongo bridge()") 
     while True: 
      ongoing_conversions_list = [] 
      for doc in self.log_database[self.ongoing_conversions].find({}, {'_id': False}).sort([("start_date", ASCENDING)]): 
       ongoing_conversions_list.append(doc) 
      self.ongoing_conversions_transmit.emit(ongoing_conversions_list) 
      sleep(2) 

И функция, вызвать работника из другого класса:

def status_worker(self): 
    mongo_settings = "dict parameter" 

    self.worker_thread_status = QtCore.QThread() 
    self.worker_object_status = StatusWidgetWorker(mongo_settings) 
    self.worker_object_status.moveToThread(self.worker_thread_status) 

    self.worker_thread_status.started.connect(self.worker_object_status.status_retriever) 
    self.worker_object_status.ongoing_conversions_transmit.connect(self.status_table_auto_updater) 

    self.worker_thread_status.start() 

Вот что я уже опробован:

  • Define a __del__ function в классе Worker эта функция никогда не вызывается.
  • Определите функцию в классе «Рабочий», а затем подключите ее к уничтоженному сигналу с помощью self.destroyed.connect(self.function). Эта функция снова не вызывается. Я думаю, это происходит потому, что сигнал излучается, когда объект уже уничтожен, а не до его уничтожения.

Я действительно интересно, о том, как это, вот некоторые части ответа:

http://www.riverbankcomputing.com/pipermail/pyqt/2014-November/035049.html

Его подход кажется немного Hacky ко мне (не в обиду автору, то, вероятно, нет простого ответа), и у меня есть сигналы & Параметры, которые нужно передать рабочему колдуну, сделают класс ThreadController messier.

Я считаю это решение немного Hacky, потому что вы должны создать класс контроллера, чтобы сделать классовую работу на

Если никто не имеет ответа, я, вероятно, использовать класс ThreadController и отправить результат здесь.

спасибо за чтение :-)

+0

Ответ на вопрос в заголовке, чтобы подключиться к [ 'QObject.destroyed'] (http://doc.qt.io/qt-5/qobject.html #destroyed) сигнал. Я не понимаю, почему вы считаете это решение «взломанным». Не могли бы вы уточнить? –

+0

отредактировал мой вопрос, теперь должно быть ясно – icefo

+0

Хмм, вы пытались подключить разрушенный сигнал к слоту в самой нити или к одному в основном потоке? –

ответ

0

Обычного правила в питоне применяется:

есть модуль для этого

решения заключается в использовании модуля atexit и зарегистрировать функция очистки в функции __init__.

Пример:

import atexit 

class StatusWidgetWorker(QObject): 

    def __init__(self): 
     super().__init__() 
     # code here 
     atexit.register(self.cleanup) 

    def cleanup(self): 
     print("Doing some long cleanup") 
     sleep(2) 
     self.bla = "Done !" 
     print(self.bla) 
Смежные вопросы