2016-07-26 54 views
1

我有一個Python程序,與cx_freeze一起打包以生成可執行文件。該程序是嚴格的數據採集桌面程序。它工作正常,在每臺計算機上都可以正常運行,但是在我們的一個Windows 7合作者的桌面上,它只在退出時崩潰(我強調沒有給出pythonic錯誤,只是一個低級別的崩潰信息,它)。簡單地啓動和退出程序會崩潰!Python 3.4:Windows上的PyQt:僅在某些計算機上退出時出現故障

我讓那個人爲我創建了一個內存轉儲,他做到了。怪異的一部分是這樣的:使用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計算機上發生。它在Windows 7的兩臺電腦上進行了測試,發生了相同的崩潰。

回答

0

原來,全部我以前遇到的這個程序崩潰的問題是因爲QThread(在Windows上)。我所知道的所有在Windows上使用QThread的用戶都遇到過類似的問題,出於某種原因,沒有人正在修復它。

避免Python上的QThread。這是完全無用的,並且比有用的更有害。我現在去了multiprocessing。它更好,並且不受GIL的影響。

1

它似乎無法釋放內存。您可以嘗試使用以下某種功能手動執行此操作:

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__'樣樣在行成一個單一的main()功能工作的時候,但是我不知道爲什麼。

+0

謝謝。我會嘗試這個並報告:) –

+0

我實施瞭解決方案...在我的電腦上工作,但在計算機上無法解決問題...它仍然在退出時崩潰。 –

+0

編輯答案怎麼樣? – BusyAnt

相關問題