2009-05-01 11 views
5

pygtkのスレッドに問題があります。私のアプリケーションは、インターネットから写真をダウンロードしてpygtkで表示するプログラムで構成されています。問題は、これを行い、GUIの応答性を保つために、スレッドを使用する必要があるということです。pygtkでスレッドを扱う方法

ユーザーがボタン "写真をダウンロード"をクリックした後、同じクラス内の写真をダウンロードする方法を呼び出した後、コールバックに入った。

thread.start_new_thread(self.images_download、(パス、ページ)

これは動作しません。私は私のプログラムがスレッドに入るために得る唯一の方法は、

gtk.threads_initを使用することです(任意のスレッドを開始する前に)

。今では写真をダウンロードするが、GUIが応答しないまま。 私はこれをGoogleで検索し、私は糸の周りgtk.threads_enterとgtk.threads_leaveを入れてみましたが、それだけでは動作しません。

答えて

12

あなたの質問は少し曖昧で、あなたの実際のコードを参照することなく、間違っていることを推測するのは難しいです。

私はあなたに読書の指針を与え、次に経験に基づいて激しく推測します。

まず、スレッドを使用してGUIを応答し続けることしかできないと考えるようです。本当じゃない。また、コードを非同期で記述し、すべての処理をシングルスレッドアプリケーションで行うこともできます。 Twistedはこのプログラミングモデル上に構築されています。私は最近、CLIとGTK +の両方のための非同期タスクインタフェースとサンプルランナーをどのように作成したかを説明しているmade a blog postです。これらの例を見て、タスクを非同期に実装する方法を確認したり、UIを更新したりすることができます。

第2に、何らかの理由でスレッドを使用する場合は、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を変更できるようにするためですが、Windowsではうまく動作しません。私はLinux上でそれをテストし、かなりうまくいっていますが、私はこれをwin32よりもうまく動作させることはできませんでした。

私はこれについて閲覧されている

===編集===、あなたは、あなたのソケットに何かがあるかどうかを確認それをつかむと、その後GUIを更新するgobject.io_add_watchを利用することができます。これについて私の投稿をチェックしてください: Sockets (and some other files) and PyGTK without threads.

関連する問題