0

我有一个挂起的 PyQt 应用程序。

Qt 4.7.4(64 位) Python 2.6.1 GCC 4.2.1 OSX 10.6.8

挂起的位置不同。如果我禁用/重写一个挂起位置,那么挂起不久就会发生在其他地方。

该应用程序执行可能返回数千个自定义数据对象的搜索,每个对象可能包含五十个子对象。

日志显示挂起往往发生在创建这些自定义对象的循环中。

该应用程序使用线程,但是即使我禁用这些线程也会发生挂起。(我正在使用Laszlo Nagy 的堆栈跟踪工具来验证这一点。即使只有主线程和堆栈跟踪线程正在运行,也会发生挂起。)

应用程序读取并创建图像文件。I/O 锁似乎不太可能是罪魁祸首,但我还没有排除它。

我想知道

我可以创建的 python 对象的数量是否有限制?

我可能会达到其他限制吗?

我没有为垃圾收集做任何明确的对象删除。我是不是该?

还有其他常见的嫌疑人吗?

编辑(8/13):

  • QTimer.singleShot 是一个很好的了解和热门线索——但是这个应用程序不使用singleShot。

  • 当应用程序挂起时,它会占用 100% 的 CPU(以及大约 140 MB 的内存。)

  • 我会尽快尝试 strace 看看它会显示什么。

4

1 回答 1

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 继承。

应用程序不再挂起,我松了一口气。

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

于 2012-08-14T00:08:20.910 回答