我有一个挂起的PyQt应用程序。
Qt 4.7.4(64位) Python 2.6.1 GCC 4.2.1 OSX 10.6.8
挂起的位置各不相同。如果我禁用/重写一个挂起位置,挂起就会在不久之后发生在其他地方。
应用程序执行的搜索可能会返回数千个自定义数据对象,每个自定义数据对象可能包含50个子对象。
记录显示挂起往往发生在创建这些自定义对象的循环中。
ALSO
应用程序使用线程,但即使禁用这些线程也会发生挂起。 (我使用Laszlo Nagy's stack trace tool来验证这一点。即使只有主线程和堆栈跟踪线程正在运行,也会发生挂起。)
应用程序读取并创建图像文件。 I / O锁似乎不太可能是罪魁祸首,但我还没有把它排除在外。
I WONDER
我可以创建的python对象数量是否有限制?
我可能会达到其他限制吗?
我没有为垃圾收集做任何显式对象删除。我应该吗?
还有其他常见的嫌疑人吗?
编辑(8/13):
QTimer.singleShot很高兴知道并且热门领先 - 但是这个应用程序不使用singleShot。
当应用程序挂起时,它声称100%CPU(和大约140 MB的内存。)
我会尽快尝试strace,看看它揭示了什么。
答案 0 :(得分:1)
我尝试了dtruss(粗略相当于OSX上的strace),但没有从结果中获得太多帮助。
最后,我接受了同事的建议,并将我的资源回滚到最后一个已知的非悬挂状态。然后我逐类重新引入更改。
罪魁祸首是从两个不同的QWidget类继承的类,例如:
class undoableWidget(QWidget) :
...
class tearableWidget(QTabWidget) :
...
class culpritWidget(undoableWidget, tearableWidget):
def __init__(self, parentWidget, tabName):
undoableWidget.__init__(self, parentWidget)
tearableWidget.__init__(self, parentWidget, tabName)
我对应用程序的工作感到惊讶。
进一步调查显示,undoableWidget首先不需要继承QWidget。
该应用程序不再挂起,我感到头晕目眩。
感谢您的建议。你帮助改善了我的调试习惯。