2014-03-25 1 views
1

나는이 문제에 대한 해결책을 광범위하게 모색했습니다. 일반 윈도우 안에 wxPython Html Window가 들어있는 프로그램을 작성하고 있습니다. 프로그램이 시작될 때 사이트에서 새 이미지를 확인하는 여러 스레드가 생성되고 발견되면 해당 스레드가 wxPython Html 창에 표시되어야합니다. GUI 클래스의 함수를 호출하여이 작업을 수행합니다.스레드에서 wxPython GUI를 업데이트 할 때 Python이 충돌 함

def appendPage(self, text): 
    self.Freeze() 
    self.htmlwin.AppendToPage(text) 
    self.Thaw() 

이 기능은 화상 파일의 URL을 수집 스레드 중 하나에서 호출

(텍스트 변수 긁어 이미지를 표시하는 HTML 코드). appendPage 함수를 호출 할 때뿐만 아니라 AppendToPage 메서드를 호출 할 때 wx.CallAfter 메서드를 사용해 보았습니다. 그럼에도 불구하고 프로그램이 중지되고 "Python.exe가 작동을 멈췄습니다"라는 메시지가 나타납니다. 죄송합니다. 엄청나게 명확하지 않은 경우이 오류가 발생하는 프로그램이 상당히 크기 때문에 여러 외부 라이브러리를 사용하기 때문에 샘플 코드를 포함하지 않았습니다. 쓰레드가 GUI를 업데이트 할 수있게하기 위해 내가해야 할 일이 정말로 없어졌습니다.

답변

0

해결책은 간단하다,

응용 프로그램이 충돌합니다 .. 스레드와 얽혀 그래픽 라이브러리를 사용하지 않는 상관없이, 당신이 말하는 GUI가에서 가져 오는 데이터를 수집하기 위해 스레드를 사용하지 않는 thread.join() 또는 비슷한 것, 그럼 너 괜찮아.
그래픽 요소를 다른 스레드에서 업데이트하려고하면 응용 프로그램을 segfault합니다.

이것은 모든 그래픽 라이브러리가 작동하는 이유입니다 (왜? 솔직히 알지는 못하지만 잠금과 관련이 있습니다. 스레드 간의 메모리 액세스로 인해 여러 소스의 그래픽 카드에 물건을 쓰지 않을 수 있습니다.) 한 가지 확실한 점은 렌더링 엔진의 단순한 복잡성이 이해하고 유지할 수있는 벅차가되기 때문입니다. 그로 인한 보상은 그리 크지 않습니다.

데이터 수집을 위해 스레드 대신 select.epoll을 사용하면 데이터를 얻기 위해 스레드가 필요하지 않지만 데이터를 기다리는 응용 프로그램을 잠글 수는 없습니다.

이것은 어떻게 문제를 돌릴 수 있는지에 대한 아이디어를 제공하고 그래픽 변경을 호출하는 작업을 스레드에 제공하는 대신 스레드에서 데이터를 가져올 수 있도록 변경을 되돌릴 수 있습니다.

또 다른 방법은 스레드에 메인 윈도우의 로컬 변수 인 self.data을 지정하고 각 렌더링 시퀀스에 대해 그래픽 요소를 self.htmlwin.AppendToPage(self.data)으로 업데이트하는 것입니다.

class mainWindow(): 
    def __init__(self): 
     self.thread = start_thread('http://google.com') 
    def appendPage(self, text): 
     self.Freeze() 
     self.htmlwin.AppendToPage(text) 
     self.Thaw() 
    def run(self): 
     while self.alive: 
      self.append(self.thread.data) 
      self.render() 
관련 문제