2009-05-01 25 views
5

Ben pygtk konuları ile ilgili bir sorunum var. Uygulamam, resimleri internetten indiren ve ardından pygtk ile görüntüleyen bir programdan oluşur. Sorun şu ki, bunu yapmak ve GUI'yi yanıtlamak için iplikleri kullanmam gerekiyor.Nasıl pygtk ile çalışmak için

Bu yüzden kullanıcı "Resimleri indir" düğmesine tıkladıktan sonra bir geri arama yaptım ve aynı sınıftaki resimleri indirmek için yöntemi çağırıyorum. Bu işe yaramaz

thread.start_new_thread (self.images_download, (yol, sayfa). Ben iplik içine almak için benim program olsun tek yolu (

gtk.threads_init kullanmaktır)

herhangi iplik başlangıç. Şimdi resim indirir önce ama GUI tepkisiz kalır. bu googled ve diş boyunca gtk.threads_enter ve gtk.threads_leave koyarak denedim ama sadece çalışmaz.

cevap

12

Sorunuz biraz belirsiz ve gerçek kodunuza referans olmadan, yanlış yaptığınızı tahmin etmek zor.

Size okumak için bazı işaretçiler vereceğim, daha sonra deneyimlere dayanarak çılgınca spekülasyon yapacağım.

Her şeyden önce, GUI yanıtını yalnızca iş parçacığı kullanarak tutabileceğinizi düşünebilirsiniz. Bu doğru değil. Kodunuzu eşzamansız olarak da yazabilir ve her şeyi tek işlemli bir uygulamada yapabilirsiniz. Bu programlama modelinde Twisted bulunur. Son zamanlarda, eşzamansız bir görev arabirimi nasıl oluşturduğumu açıklayan made a blog post ve hem CLI hem de GTK + için örnek koşucular. Görevlerin eşzamansız olarak nasıl uygulanabileceğini görmek için bu örneklere bakabilirsiniz ve kullanıcı arayüzü hala güncellenir.

İkincisi, herhangi bir nedenle thread kullanmayı tercih ederseniz, GTK + threading modelini biraz anlamanız gerekecektir.

The PyGTK FAQ entry on the subject'u okuyarak başlamalı ve this blog post'u da anlamanız kolay olabilir.

Şimdi, spekülasyona geçin. GTK UI'nizi iş parçacığından güncellemeye çalıştığınızı ve kilitlemeyi düzgün bir şekilde işlemediğinizi tahmin ediyorum. Eğer durum böyle ise, gobject.idle_add() kullanarak iş parçacığından ana iş parçacığına yapmak istediğiniz tüm UI güncellemelerini ertelemek için daha iyi durumdasınız. Bu şekilde, tüm UI çağrıları ana iş parçacığından yapılacaktır. Programlamada takip etmek daha kolay bir zihinsel modeldir. Eğer gerçekten diş çekme ve kilitleme modellerini anlamak hissettikten sonra

, kendi iş parçacığı UI güncelleme düşünebiliriz, ama()/threads_leave()

+0

+1: Konuları kullanmayın, sadece zaman uyumsuz G/Ç kullanın. – nosklo

1

Sen gtk.gdk kullanabileceği bir threads_enter kaçırmak kolaydır. thread_init() herhangi bir iş parçacığının, gtk.gdk.threads_enter() ve gtk.gdk.theads_leave() kilidine saygı göstererek UI'yi değiştirmesine izin vermek için, ancak, bununla ilgili sorun, pencerelerde iyi çalışmadığıdır. Linux üzerinde test ettim ve oldukça iyi bir performans sergiliyordum ama bunu win32 üzerinde çalışmak için hiç şansım olmadı.

Bu konuda gezen edilmiştir

=== Düzenleme ===, siz, prize bir şey varsa kontrol yakala ve sonra GUI güncelleştirmek için gobject.io_add_watch devreye sokabilir.Bu yazı hakkında kontrol: Sockets (and some other files) and PyGTK without threads.

İlgili konular