2012-08-03 72 views
0

我有一个挂起的PyQt应用程序。在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锁似乎不太可能是罪魁祸首,但我还没有排除。

不知

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

有没有其他的限制,我可能会达到?

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

有没有其他常见的嫌疑犯?

EDIT(8/13):

  • QTimer.singleShot是很好的了解和引热议 - 然而,这应用程序不使用singleShot。

  • 当应用程序挂起,它声称100%的CPU(约140 MB的内存。)

  • 我会尽快尝试strace的,看看它揭示。

+1

尝试使用'strace'运行你的程序,它显示你的程序所做的系统调用。这应该使您能够在发生阻塞系统调用时看到挂起。 – Giel 2012-08-03 21:01:30

+0

这些搜索和它们返回的数据对象是否可以从界面分离?如果不是,他们应该是。这不会解决问题,但它会使调试变得更容易。 – 2012-08-03 21:31:23

+3

当应用程序“挂起”时,你的内存/ CPU使用情况如何? – cwa 2012-08-04 00:45:19

回答

1

我试图dtruss(strace的粗略等同于OSX),但没有从结果中获得很大的帮助。

最后,我接受了一位同事的建议,并将我的信息源恢复到最后一个已知的非悬挂状态。然后我重新引入了班级的变化。

罪魁祸首是一类从两个不同的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) 

我很惊讶的应用程序工作在所有。

进一步的调查显示,需要首先从QWidget继承的不需要的Widget。

应用程序不再挂起,我晕了起来。

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

相关问题