我打算寫一個帶GUI前端的網絡應用程序,大概是使用GTK。GTK網絡應用程序:需要設計模式
我完全不熟悉GTK(以及一般的GUI編程)。我目前的猜測是使用兩個線程,一個處理網絡,另一個運行GTK前端。
這是這類問題的常見設計模式,還是有更好的選擇,例如處理來自GTK主循環內部的網絡?
如果我不得不求助於使用兩個線程,告訴GTK線程有從網絡線程獲得數據的最好方法是什麼?
我打算寫一個帶GUI前端的網絡應用程序,大概是使用GTK。GTK網絡應用程序:需要設計模式
我完全不熟悉GTK(以及一般的GUI編程)。我目前的猜測是使用兩個線程,一個處理網絡,另一個運行GTK前端。
這是這類問題的常見設計模式,還是有更好的選擇,例如處理來自GTK主循環內部的網絡?
如果我不得不求助於使用兩個線程,告訴GTK線程有從網絡線程獲得數據的最好方法是什麼?
正常的GTK +做事的方式是在主線程上使用GUI,而在其他線程上使用慢操作。請注意,當你想從另一個線程更新GUI時,你必須這樣做inside the GDK lock。文檔中提到「使用Win32後端,GDK調用不應該從多個線程嘗試」,但可以使用g_idle_add來解決,該調用在GUI線程上排隊調用。
可以異步GIO功能的使用(如g_input_stream_read_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有點類似的例子(P線程)在以前鏈接的GDK Threads documentation中。
在GUI編程中讀到的第一件事是模型視圖控制器模式。您希望儘可能將數據流從GUI中分離出來。網絡代碼更新數據模型。當數據模型發生變化時,它會向前端發出信號,以便GUI可以重繪。
聽起來很直觀。如何向GTK表明數據模型已更改? – Philip
請參閱本教程,瞭解如何在pygtk中創建自定義信號http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm#d0e570 – TJD