2009-05-01 7 views
5

pygtk의 스레드에 문제가 있습니다. 내 응용 프로그램은 인터넷에서 사진을 다운로드 한 다음 pygtk로 표시하는 프로그램으로 구성됩니다. 문제는이 작업을 수행하고 GUI 응답을 유지하기 위해서 스레드를 사용해야한다는 것입니다.pygtk에서 스레드를 사용하는 방법

그래서 사용자가 "사진 다운로드"버튼을 클릭 한 후 같은 클래스에있는 사진을 다운로드하는 방법을 호출하면 콜백에 들어갔다. 이 작동하지 않습니다

thread.start_new_thread (self.images_download (경로 페이지). 내가 스레드에 들어갈 내 프로그램을 얻을 수있는 유일한 방법은 (

gtk.threads_init을 사용하는 것입니다)

는 스레드를 시작하는. 지금은 사진을 다운로드하기 전에하지만 GUI가 응답하지 남아있다. 나는이를 봤 내가 스레드 주위에 gtk.threads_enter 및 gtk.threads_leave 퍼팅 시도했지만 그냥 작동하지 않습니다.

답변

12

귀하의 질문은 약간 모호하며 실제 코드를 참조하지 않고 잘못하고있는 것을 추측하기가 어렵습니다.

그래서 나는 몇 가지 지침을 읽고 경험을 바탕으로 격렬하게 추측 할 것입니다.

우선, 스레드를 사용하여 GUI를 응답 가능하게 유지할 수 있다고 생각하는 것 같습니다. 이것은 사실이 아닙니다. 코드를 비동기 적으로 작성하고 단일 스레드 응용 프로그램에서 모든 작업을 수행 할 수도 있습니다. Twisted은이 프로그래밍 모델을 기반으로합니다. 내가 최근에 made a blog post 어떻게 비동기 작업 인터페이스를 만들 었는지 설명하고 CLI와 GTK +에 대한 예제 주자. 이러한 예제를 보면 작업을 비동기 적으로 구현할 수있는 방법을 확인할 수 있으며 UI는 여전히 업데이트됩니다.

둘째, 어떤 이유로 스레드를 사용하려면 GTK + 스레딩 모델을 약간 이해해야합니다.

The PyGTK FAQ entry on the subject으로 시작해야하며 this blog post도 쉽게 이해할 수 있습니다.

이제 추측을 위해. 스레드에서 GTK UI를 업데이트하려고 시도하고 잠금을 제대로 처리하지 못하고있는 것 같습니다. 이 경우 gobject.idle_add()를 사용하여 스레드에서 주 스레드로 수행하려는 모든 UI 업데이트를 연기하는 것이 좋습니다. 이렇게하면 모든 UI 호출이 주 스레드에서 수행됩니다. 프로그래밍에서 따라야 할 더 쉬운 정신 모델입니다. 당신은 당신이 정말로 스레딩 및 잠금 모델을 이해 느끼면

, 당신은 당신의 스레드에서 UI를 업데이트 고려할 수 있지만,()/threads_leave()

+0

+1 : 스레드를 사용하지 말고 그냥 비동기 I/O를 사용하십시오. – nosklo

1

당신은 gtk.gdk를 사용할 수있는 threads_enter를 그리워 쉽습니다. threads_init()는 모든 스레드가 gtk.gdk.threads_enter() 및 gtk.gdk.theads_leave() 잠금을 사용하여 UI를 수정하도록 허용하지만이 문제는 윈도우에서 제대로 작동하지 않는다는 것을 의미합니다. 나는 리눅스에서 그것을 테스트했고 꽤 잘 수행했다. 그러나 나는 win32보다 더 잘 작동하도록 만들지 않았다.

나는 이것에 대해 검색 한

=== 편집 ===, 당신은 당신의 소켓에 무언가가 있는지 확인을 잡아 한 후 GUI를 업데이트 할 gobject.io_add_watch의 사용을 만들 수 있습니다.이것에 대해 내 게시물을 확인하십시오 : Sockets (and some other files) and PyGTK without threads.

관련 문제