5

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

そのため、ユーザーが「画像のダウンロード」ボタンをクリックした後、コールバックに入り、同じクラス内にある画像をダウンロードするメソッドを呼び出しました。

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

これはうまくいきません。プログラムをスレッドに入れる唯一の方法は、

gtk.threads_init()

スレッドを開始する前。これで画像がダウンロードされますが、GUI は応答しません。これをグーグルで検索し、スレッドの周りに gtk.threads_enter と gtk.threads_leave を配置しようとしましたが、うまくいきません。

4

2 に答える 2

12

あなたの質問は少しあいまいです。実際のコードへの参照がなければ、何が間違っているのかを推測するのは困難です。

ですから、読むための指針をいくつか示してから、経験に基づいて大雑把に推測してください。

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

第二に、何らかの理由でスレッドを使用したい場合は、GTK+ スレッド モデルを少し理解する必要があります。

件名の PyGTK FAQ エントリを読むことから始める必要があります。このブログ投稿も理解しやすいかもしれません。

では、推測に移ります。スレッドから GTK UI を更新しようとしていて、ロックを適切に処理していないと推測しています。この場合、gobject.idle_add() を使用してスレッドから実行するすべての UI 更新を今のところ延期することをお勧めします。この方法では、すべての UI 呼び出しがメイン スレッドから行われます。これは、プログラミングで従うのがより簡単なメンタル モデルです。

スレッド化モデルとロック モデルを本当に理解したら、スレッドから UI を更新することを検討できますが、threads_enter()/threads_leave() を見逃すのは簡単です。

于 2009-05-01T10:03:37.993 に答える
1

gtk.gdk.threads_init() を使用して、任意のスレッドが gtk.gdk.threads_enter() および gtk.gdk.theads_leave() ロックを尊重して UI を変更できるようにすることができますが、これの問題はそうではないことです。 Windowsでうまく動作します。Linux でテストしたところ、非常にうまく機能しましたが、これを win32 で動作させることはできませんでした。

=== 編集 ===

私はこれについて閲覧してきました.gobject.io_add_watchを使用して、ソケットに何かがあるかどうかを確認し、それを取得してからGUIを更新できます. これについての私の投稿を確認してください: ソケット (およびその他のファイル) とスレッドなしの PyGTK。

于 2009-05-23T03:32:33.280 に答える