PyQt5:QApplication获得越来越多的QTimers

时间:2015-12-08 17:52:06

标签: python qt memory-leaks

对于使用PyQt5在Python 3.4中构建的应用程序(并且使用asyncio和quamash,我有一个奇怪的效果,如果这很重要)。该程序执行一些周期性的操作,一次使用单独的线程time.sleep(),一次使用asyncio协程和asyncio.sleep()。现在,只要启动这些周期性操作中的一个或两个,应用程序的内存消耗就会稳定增加。使用objgraph模块和一些调试,我发现有很多QTimer个对象生成并添加到主QApplication对象(如果objgraph.show_backrefs()from PyQt5.QtCore import * app = QCoreApplication.instance() len(app.children()) Out[3]: 7627 len(app.children()) Out[4]: 8127 app.children()[0:10] Out[5]: [<PyQt5.QtCore.QAbstractEventDispatcher at 0x6155670>, <PyQt5.QtGui.QSessionManager at 0x61556c0>, <PyQt5.QtWidgets.QCommonStyle at 0x6155760>, <PyQt5.QtCore.QTimer at 0x53a35d0>, <PyQt5.QtCore.QTimer at 0x53a3580>, <PyQt5.QtCore.QTimer at 0x53a36c0>, <PyQt5.QtCore.QObject at 0x61557b0>, <PyQt5.QtCore.QTimer at 0x53bbd50>, <PyQt5.QtCore.QTimer at 0x53bbda0>, <PyQt5.QtCore.QTimer at 0x6a81080>] ,则不会被其他任何对象引用对)。我可以在直接检查QAp​​plication对象的子项时看到这一点:

for t in filter(lambda o: isinstance(o, QTimer), app.children()):
    t.setParent(None)

这非常有趣(而且很烦人),特别是考虑到我自己不创建任何单个QTimer对象时。 Qt使用的那些计时器是什么?当我手动删除所有QTimer对象时

require.js

然后没有释放内存,但消耗不会进一步增加。该应用程序似乎仍然正常工作。在打开和关闭一些窗口之后,恢复原始行为,即生成新的定时器并且增加存储器消耗。在哪里/如何进行更多调试以找到原因?

非常欢迎任何提示!

此致 菲利普

0 个答案:

没有答案