2010-12-06 4 views
2

wxPython으로 옵저버 디자인 패턴을 구현하려고합니다. 나는 막대한 양의 데이터를 백그라운드로 계산하는 모델링 어플리케이션을 가지고있다. 때로는 GUI에서 모델의 출력을 표시하고 싶습니다. 이것은 여러 색상의 사각형 그리드입니다. 다른 때는 GUI를 표시하지 않고 계산을 수행해야합니다.wxPython의 옵저버 패턴

관찰자 패턴의 장점은 방금 추가하거나 한 줄의 코드,

self.observers.append(MyWxGui()) 

또는 이와 유사한 같은 것을 제거하여 GUI 또는하지 연결 수 있다는 것입니다. 이제는 하나의 스레드에서 실행하려면 계산이 필요하고 wx GUI는 다른 스레드에서 실행해야합니다. 메인 스레드에서 실행)

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0. 

나는 그런 http://wiki.wxpython.org/LongRunningTasks 등의 wxPython에서 멀티 스레딩에 대한 자습서를 읽을 수 있지만 그들은 모두 주회 돌이를 (이 : 나는 wxPython을 함께이 일을 시도하지만 난 항상 치명적인 I/O 오류가 그리고 보조 스레드에서 장기 실행 작업보다, 나는 다른 방법으로 라운드해야합니다. 메인 스레드에서 Mainloop()을 사용하면 계산을 진행하는 대신 GUI의 이벤트를 기다리는 동안 프로그램이 중단되기 때문입니다.

하위 스레드에서 ClientDC 나 PaintDC와 같은 Device contexts (DC)를 조작 할 수없는 것도 보았습니다.하지만 동일한 스레드 내에서 전체 wx 코드를 실행하고 있습니다.

Mainloop() 및 모든 wx GUI를 주 응용 프로그램이 아닌 자체 스레드에서 실행할 수 있습니까?

wxPython 2.8.11.0을 Ubuntu 10.10에서 실행 중입니다.

+0

(wx) 파이썬에서 관찰자 패턴의 (스레드되지 않은) 구현을 알고 있습니까? 아래에 언급 된 바와 같이 Pubsub는 전 세계 게시자 - 구독자의 일이며 아직 구현 된 관찰자 패턴을 찾지 못했습니다. – virtualnobi

답변

3

위키 페이지를 읽으면 wx.CallAfter, wxCallLater 또는 wx.PostEvent를 스레드 세이프 방식으로 사용하여 wx 스레드와 다시 통신 할 수 있다는 것을 알아야합니다.

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

개인적으로, 나는 WX의 주회 돌이와 통신하기 위해 위에서 언급 한 스레드 방법 Pubsub + 하나 같은 것을 사용하는 것이 : 여기 간단한 튜토리얼이있다. Pubsub에 대한 좋은 점은 메시지를 청취하고 적절하게 반응 할 수 있다는 것입니다. 위의 예제는 실제로이를 수행하는 한 가지 방법을 보여줍니다. 다행히 그것이 당신을 도울 것입니다. 그렇지 않다면 wxPython 메일 링리스트에 가입하여 거기에 묻는 것이 좋습니다. http://groups.google.com/group/wxpython-users/topics?pli=1

+0

이 질문에 대한 답변을 생각하지 않습니다. CallAfter 및 시뮬레이션. 모델이 시작되면 처리를 계속하도록 모델을 호출하는 GUI입니다. 내 목표는 Observer 패턴을 완벽하게 구현하여 GUI없이 모델을 완전히 실행하는 것입니다. 예를 들어 GUI가 사용 중지 된 경우 (예 : 사용자가 GUI없이 프로그램을 실행하기로 결정한 경우) : GUI가 CallAfter에서 호출 한 명령을 GUI가 실행하기를 기다리는 경우 어떻게 계속 될까요? 모델은 관찰자 아이디어를 무력화시키는 GUI가 잠재적으로 존재한다는 사실을 인식해야합니다. – gozzilli

+0

Pubsub는 wx 외부에서 작동하므로이 기능이 작동한다고 생각합니다. 아니면 뭔가를 오해하고 있습니다. –