在PyQt应用程序中挂起的可能原因是什么?

时间:2012-08-03 20:58:03

标签: python multithreading pyqt hang

我有一个挂起的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,看看它揭示了什么。

1 个答案:

答案 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。

该应用程序不再挂起,我感到头晕目眩。

感谢您的建议。你帮助改善了我的调试习惯。