Python 3.4:Windows上的PyQt:仅在某些计算机上退出时崩溃

时间:2016-07-26 12:44:19

标签: python crash pyqt exit crash-dumps

我有一个Python程序,我与cx_freeze一起打包以生成可执行文件。该程序严格来说是一个用于数据采集的桌面程序。它工作正常并且在每台计算机上都很好,但是在我们的一个Windows 7协作者的桌面上,它只在退出时崩溃(我强调没有给出pythonic错误。只是一个低级别的崩溃,零信息关于它)。只需启动和退出程序就会崩溃!

我让那个人为我创建了一个内存转储,他做到了。奇怪的部分如下:从中创建内存转储并使用WinDbg进行分析会产生以下错误链:

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
0020f940 5c51b34e 5c7bd640 9d7a3385 03c93748 QtCore4!QHashData::free_helper+0x26
0020f974 76e314bd 00b30000 00000000 03e0c4c0 QtGui4!QGestureRecognizer::reset+0x1f9e
0020f9a0 5c51c968 03c93748 5d3608c2 00000001 kernel32!HeapFree+0x14
0020f9a8 5d3608c2 00000001 03c93748 03891250 QtGui4!QGestureRecognizer::reset+0x35b8
0020f9c0 5d3627b5 9d0dae1c 03891250 03cac0a0 QtCore4!QObjectPrivate::deleteChildren+0x72
00000000 00000000 00000000 00000000 00000000 QtCore4!QObject::~QObject+0x3e5

现在让我感到惊讶的是,来自QGestureRecognizer的投诉(part of QtGUI apparently)给出了!但为什么?我没有使用任何触控功能!我使用的模块是:QtCoreQtGUI。这是从哪里来的?我是否可以强制禁用与该类相关的所有内容:QGestureRecognizer?在这种情况下你会做什么?

更新

此问题似乎只发生在Windows 7计算机上。它在2台装有Windows 7的计算机上进行了测试,同样发生了崩溃。

2 个答案:

答案 0 :(得分:1)

似乎无法释放内存。您可以尝试使用以下函数手动执行此操作:

!mdt

然后在主窗口小部件中定义清理方法。

def clean(item):
    """Clean up the memory by closing and deleting the item if possible."""
    if isinstance(item, list) or isinstance(item, dict):
        for _ in range(len(item)):
            clean(list(item).pop())
    else:
        try:
            item.close()
        except (RuntimeError, AttributeError): # deleted or no close method
            try:
                item.deleteLater()
            except (RuntimeError, AttributeError): # deleted or no deleteLater method
                pass

最后,在致电class MyWindow(QWidget): def cleanUp(self): # Clean up everything for i in self.__dict__: item = self.__dict__[i] clean(item) 之前,您必须像这样连接:

qt_app._exec()

其中qt_app.aboutToQuit.connect(app.cleanUp) 是您的主窗口。

修改

app行下的所有内容包装到单个if __name__ == '__main__'函数中有时会有效,但我不知道为什么。

答案 1 :(得分:0)

事实证明, ALL 我曾经遇到过这个程序崩溃的问题是因为QThread(在Windows上)。我所知道的在Windows上使用QThread的所有用户都遇到了类似的问题,并且出于某种原因没有人在修复它。

避免在Python上使用QThread。它完全没用,比有用更有害。我现在去了multiprocessing。它好得多,不受GIL的影响。