2012-05-12 2 views
1

이 wxPython에의 소스 파일에서 발췌 한 것입니다GUI 스레드의 컨텍스트 여야하는 이유는 무엇입니까?

내부적으로이 작업을 수행하는 방법
""" 
    Create the output window if needed and write the string to it. 
    If not called in the context of the gui thread then uses 
    CallAfter to do the work there. 
    """   

? 왜 GUI 관련 호출이 다른 스레드에 의해 직접 만들어지지 않는 것이 중요합니까?

이러한 GUI 개념을 간략하고 간단하게 설명하는 차트 나 그 밖의 것이 있습니까?

내 디자인을 선택하는 방법을 알기 위해이 문제를 이해하기 위해 소설을 읽지 않아도된다면 좋겠다.


편집 :

이 아래에 대한 설명은 다음과 같습니다

꽤 쉽게

Diagram

+1

여러 스레드에서 호출되는 것을 지원하는 GUI 코드가 필요하지 않습니다. 이렇게하려면 모든 종류의 동기화 코드를 GUI 프레임 워크에 추가해야합니다. 따라서 거의 모든 GUI 프레임 워크는 클라이언트가 GUI 스레드에서만 호출하도록 요구합니다. 이 프레임 워크의 클라이언트는 결정이 내려진 이유와 거의 무관합니다. 그것이 바로 그 것이다. –

답변

1

. 대기열에 대해 생각해 보면 wxPython에는 내부 이벤트 대기열이 있으므로 메인 스레드에서 호출 될 app에서 MainLoop을 호출 할 때 wxPython이 처리하도록합니다. 따라서 위젯을 수정할 때마다 Event-Queue를 처리하는 MainLoop을 방해하지 않습니다. 그러나 스레드를 추가 할 때 하나 이상의 스레드가 GUI 및/또는 이벤트 대기열을 조작하고 GUI 액세스가 동기화되지 않습니다. wx.CallAfter가 유용하게 쓰이는 곳은 Event-Queue에 의사 이벤트를 추가하는 것입니다.이 이벤트는 지정된 함수를 호출하므로 Main-Thread에서 실행되고 하나의 Thread 만 GUI에 액세스합니다. 참고로, 전달 된 함수가 반환되기까지 시간이 걸리면 더 이상의 이벤트 (예 : 이동 또는 클릭)가 처리되지 않기 때문에 GUI가 고정됩니다.

관련 : http://wiki.wxpython.org/LongRunningTasks

+0

"이고 GUI 액세스가 동기화되지 않습니다." 왜 이런 일이 안되는지 말해 줄 수 있어요? 너무 많은 노력이나 그런 종류의 것이겠습니까? 귀하의 설명 btw 주셔서 감사합니다. – rynd

+0

죄송합니다. 추측하지 않고 동기화되지 않은 이유를 말씀 드릴 수는 없습니다. 답변을 원할 경우 wxPython 메일 링리스트 RobinD에서 질문 할 수 있습니다. 이 질문에 답할 수 있습니다. – dav1d

+0

당신의 설명이 제 이해에 도움이되었습니다. 그러나 어쨌든 나는 더 이상 아무것도 이해하지 못한다는 것을 지적합니다. 그래서 StaticText.GetLabel과 같은 메소드는 메인 루프에서 메시지를 처리하도록 트리거합니까, 아니면 무엇입니까? 이거 분명히 해줄 수 있니, 제발? – rynd

관련 문제