2011-12-03 3 views
1

GTK를 사용하여 GUI 프론트 엔드로 네트워킹 애플리케이션을 작성하려고합니다.GTK 네트워킹 앱 : 디자인 패턴이 필요합니다.

저는 GTK (및 GUI 프로그래밍 전반)에 완전히 익숙합니다. 내 현재 추측은 네트워킹을 처리하는 스레드와 GTK 프론트 엔드를 실행하는 스레드라는 두 개의 스레드를 사용하는 것입니다.

이런 종류의 문제에 대한 일반적인 디자인 패턴인가요? 아니면 더 나은 대안이 있습니까? GTK 메인 루프 내에서 네트워킹을 다루는가?

두 개의 스레드를 사용해야한다면 GTK 스레드에 네트워킹 스레드에서 사용할 수있는 데이터를 알려주는 가장 좋은 방법은 무엇입니까?

답변

2

일을하는 일반적인 GTK + 방법은 메인 스레드에서 GUI를 사용하는 반면 느린 작업은 다른 스레드에서 수행하는 것입니다. 다른 스레드에서 GUI를 업데이트하려면 inside the GDK lock해야합니다. 문서에 "Win32 백엔드를 사용하면 GDK 호출을 여러 스레드에서 시도해서는 안됩니다."라고 언급되어 있지만 GUI 스레드에서 호출을 대기중인 g_idle_add으로 처리 할 수 ​​있습니다.

당신은 (예를 들어 g_input_stream_read_async) 네트워크 작업하지만, 예를 들어 일반적인 스레딩 라이브러리를 사용에서 당신을 중지 아무것도, 없다 GIO 기능 비동기 사용할 수 있습니다 C를 사용하여 다소 유사한 예는있다

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") 

(의 pthreads) 이전에 연결된 GDK Threads documentation에 있습니다.

1

GUI 프로그래밍에서 가장 먼저 알아야 할 것은 Model View Controller 패턴입니다. 가능한 한 GUI에서 데이터 플로우를 분리하려고합니다. 네트워킹 코드는 데이터 모델을 업데이트합니다. 데이터 모델이 변경되면 프런트 엔드에 신호를 보내 GUI가 다시 그릴 수있게합니다.

+0

소리가 직관적입니다. GTK에 데이터 모델이 변경되었다는 신호를 보내려면 어떻게해야합니까? – Philip

+0

pygtk에서 맞춤 신호 생성에 대한이 자습서를 참조하십시오. http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm#d0e570 – TJD

관련 문제