문제

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

그래서 사용자가 "사진 다운로드"버튼을 클릭 한 후 콜백에 들어갔고 동일한 클래스 내에있는 사진을 다운로드하기 위해 메소드를 호출합니다.

Thread.start_new_thread (self.images_download, (경로, 페이지)

이것은 작동하지 않습니다. 스레드에 들어가는 프로그램을 얻는 유일한 방법은 사용하는 것입니다.

gtk.threads_init ()

스레드를 시작하기 전에. 이제 사진을 다운로드하지만 GUI는 응답하지 않습니다. 나는 이것을 구글링하고 gtk.threads_enter 및 gtk.threads_leave를 스레드 주위에 넣었지만 작동하지 않습니다.

도움이 되었습니까?

해결책

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

그래서 나는 당신에게 읽을 수있는 몇 가지 포인터를주고 경험에 따라 격렬하게 추측 할 것입니다.

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

둘째, 어떤 이유로 든 스레드를 선호하는 경우 GTK+ 스레딩 모델을 약간 이해해야합니다.

당신은 독서로 시작해야합니다 주제에 대한 Pygtk FAQ 항목, 그리고 당신은 찾을 수 있습니다 이 블로그 게시물 이해하기 쉽습니다.

이제 추측에. 스레드에서 GTK UI를 업데이트하려고하고 잠금을 올바르게 처리하지 않는다고 생각합니다. 이 경우 gobject.idle_add ()이 방식으로 사용하여 스레드에서 기본 스레드로 수행하려는 모든 UI 업데이트를 연기하는 것이 좋습니다. 모든 UI 호출은 기본 스레드에서 이루어집니다. 프로그래밍에서 따르는 것이 더 쉬운 정신 모델입니다.

스레딩 및 잠금 모델을 실제로 이해한다고 생각되면 스레드에서 UI를 업데이트하는 것을 고려할 수 있지만 Threads_Enter ()/Threads_Leave ()를 놓치기 쉽습니다.

다른 팁

gtk.gdk.threads_init ()를 사용하여 모든 스레드가 gtk.gdk.threads_enter () 및 gtk.gdk.theads_leave () 잠금으로 UI를 수정할 수 있도록 할 수 있지만, 문제는 그렇지 않습니다. 창에서 잘 작동합니다. 나는 Linux에서 그것을 테스트하고 잘 수행했지만 Win32에서 작동하는 데 운이 좋지 않았습니다.

=== 편집 ===

나는 이것에 대해 탐색하고있다. 당신은 gobject.io_add_watch를 사용하여 소켓에 무언가가 있는지 확인한 다음 GUI를 업데이트 할 수 있습니다. 이것에 대해 내 게시물을 확인하십시오.스레드가없는 소켓 (및 기타 파일) 및 Pygtk.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top