QObject即将被销毁时如何调用函数?
How to call a function when a QObject is about to be destroyed?
我想在对象销毁之前在对象内部做一些清理操作。在这种情况下,它将关闭与数据库的连接。
这是我已经在做的事情:
工人class:
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)
以及从另一个调用 worker 的函数 class :
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在Workerclass中,这个函数永远不会被调用。
- 在Worker中定义一个函数class,然后用
self.destroyed.connect(self.function)
将它连接到销毁的信号上。这个函数再也不会被调用。我认为发生这种情况是因为信号是在对象已经被销毁时发出的,而不是在它被销毁之前。
我真的很想知道如何做到这一点,这里是部分答案:
http://www.riverbankcomputing.com/pipermail/pyqt/2014-November/035049.html
他的方法对我来说似乎有点老套(没有冒犯作者,可能没有简单的答案)并且我有信号和参数传递给工作人员 将使 ThreadController class混乱。
我觉得这个解决方案有点老套,因为你必须设置一个控制器 class 来完成 Worker class 工作
如果没有人有答案,我可能会在这里使用 ThreadController class 和 post 结果。
感谢您的阅读:-)
python 中的常用规则适用:
there is a module for that
解决方法是使用atexit模块,在__init__
函数中注册cleanup函数
示例:
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)
我想在对象销毁之前在对象内部做一些清理操作。在这种情况下,它将关闭与数据库的连接。
这是我已经在做的事情:
工人class:
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)
以及从另一个调用 worker 的函数 class :
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在Workerclass中,这个函数永远不会被调用。 - 在Worker中定义一个函数class,然后用
self.destroyed.connect(self.function)
将它连接到销毁的信号上。这个函数再也不会被调用。我认为发生这种情况是因为信号是在对象已经被销毁时发出的,而不是在它被销毁之前。
我真的很想知道如何做到这一点,这里是部分答案:
http://www.riverbankcomputing.com/pipermail/pyqt/2014-November/035049.html
他的方法对我来说似乎有点老套(没有冒犯作者,可能没有简单的答案)并且我有信号和参数传递给工作人员 将使 ThreadController class混乱。
我觉得这个解决方案有点老套,因为你必须设置一个控制器 class 来完成 Worker class 工作
如果没有人有答案,我可能会在这里使用 ThreadController class 和 post 结果。
感谢您的阅读:-)
python 中的常用规则适用:
there is a module for that
解决方法是使用atexit模块,在__init__
函数中注册cleanup函数
示例:
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)