2016-07-26 7 views
1

cx_freeze으로 패키지 된 Python 프로그램이 실행 파일로 만들어졌습니다. 이 프로그램은 엄격하게 데이터 수집을위한 데스크톱 프로그램입니다. 제대로 작동하고 모든 컴퓨터에서 정상적으로 종료되지만 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 

이제 어떻게 저를 놀라게하는 것은 (A part of QtGUI apparently입니다) QGestureRecognizer에서 불만이 있다는 것이다 주어진! 하지만 왜? 터치 기능을 사용하지 않습니다! 내가 사용하는 모듈은 QtCoreQtGUI입니다. 이게 어디서 오는거야? 그 수업과 관련된 모든 것을 무력화 할 수 있습니까? QGestureRecognizer? 이 경우 당신은 무엇을 할 것입니까?

업데이트 :

이 문제는에 윈도우 7 컴퓨터에 일어날 것으로 보인다. Windows 7이 설치된 2 대의 컴퓨터에서 테스트되었으며 동일한 충돌이 발생했습니다.

답변

0

ALL이 프로그램의 충돌로 인해 발생했던 문제는 QThread (Windows) 때문이었습니다. Windows에서 QThread를 사용하는 모든 사용자는 비슷한 문제를 겪고 있으며 어떤 이유로 든 아무 문제가 없습니다.

QThread on Python을 피하십시오. 그것은 유용하지 않고 완전히 쓸모없고 해롭다. 나는 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가 메인 창입니다.


편집 : 하나의 main() 기능에 if __name__ == '__main__' 라인에 따라 모든 것을 포장

가끔 작동하지만, 내가 왜 아무 생각이 없습니다.

+0

감사합니다. 나는 이것을 시도하고보고 할 것이다 :) –

+0

나는 해결책을 구현했다 ... 내 컴퓨터에서 작동하지만, 문제가있는 컴퓨터에서는 작동하지 않는다 ... 출구에서 여전히 충돌한다. –

+0

수정 된 답변은 어떻게됩니까? – BusyAnt