2011-12-03 9 views
1

GUIフロントエンドを使用して、おそらくGTKを使用してネットワーキングアプリケーションを作成するつもりです。GTKネットワーキングアプリケーション:デザインパターンが必要

私はGTK(そしてGUIプログラミング全般)を全く新しくしています。私の現在の推測は、ネットワークとGTKフロントエンドを実行するもう1つのスレッドを扱う2つのスレッドを使用することです。

これはこの種の問題の一般的なデザインパターンですか、より良い代替品ですか? GTKのメインループ内からのネットワークの処理?

2つのスレッドを使用する必要がある場合、GTKスレッドにネットワークスレッドから利用可能なデータがあることを伝える最も良い方法は何ですか?

答えて

2

通常のGTK +のやり方は、メインスレッドでGUIを使用することですが、低速操作は他のスレッドで行います。別のスレッドからGUIを更新する場合は、inside the GDK lockを実行する必要があります。 "Win32バックエンドでは、GDK呼び出しを複数のスレッドから試みるべきではありません"と書かれていますが、g_idle_addで処理することができます。これはGUIスレッド上で呼び出しをキューに入れます。

あなたのネットワーク運用のためのGIO機能(例えば g_input_stream_read_async)非同期(async)を使用することができますが、例えば、一般的なスレッドライブラリを使用してからあなたを止めるものは何もありません

gtk.gdk.threads_init() 

... 

def on_button_clicked(button): 
    label.set_text("Doing something...") 
    threading.Thread(target=do_something).start() 

def do_something(): 
    time.sleep(2) 
    glib.idle_add(label.set_text, "Done") 

やや同様の例は、C(pthreadsを使用してあります)を以前にリンクされたGDK Threads documentationに置き換えます。

1

GUIプログラミングで最初に読み進めるのは、モデルビューのコントローラパターンです。できるだけGUIからデータフローを分離したいとします。ネットワーキングコードは、データモデルを更新します。データモデルが変更されると、GUIが再描画できるようにフロントエンドに信号を送ります。

+0

音が直感的です。 GTKにデータモデルが変更されたことを通知するにはどうすればよいですか? – Philip

+0

pygtkでカスタム信号を作成するチュートリアルを参照してください。http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm#d0e570 – TJD

関連する問題