GTK+ 플밍 질문입니다;; 사실 linspot gui 화 중이었는데 -_-;;;
글쓴이: jenix / 작성시간: 목, 2004/06/17 - 12:26오후
안녕하세요 -_-;;
gtk+ 플밍 질문인데요;;
사실 linspot 을.. gui 화 하고 있었습니다.
이제, 거의다 되긴 했는데;;
접속 버튼을 누르면
팝업 dialog 가 뜨고.. 접속 진행중일시에는
dialog 에 connecting... 이.. 그리고 함수가 종료되서 함수 리턴값에 따라
Connection Success 혹은 Connection Failed 로 dialog 라벨을 바꾸려고 하는데요..
아래와 같이 코딩을 해버렸더니;;
nespot_connect 함수가 리턴값을 반환할 때 까지 dialog 출력을 안해주더라구요?
일단 다이아로그를 띄어두고 connecting... 띄어둔채로.. 함수 실행하고 리턴값 받은 후 다시 label 을 교체하는 방식을 쓰려 했는데..
106 /* 접속 진행 Dialog 상자를 표시, 네스팟 접속 */ 107 void connect_dialog() { 108 109 int i; 110 GtkWidget *dialog, *label; 111 112 /* Create the widgets */ 113 114 dialog = gtk_dialog_new_with_buttons ("Message", 115 GTK_WINDOW(window), 116 GTK_DIALOG_DESTROY_WITH_PARENT, 117 GTK_STOCK_OK, 118 GTK_RESPONSE_NONE, 119 NULL); 120 121 label = gtk_label_new ("\nConnecting...\n"); 122 gtk_widget_show(label); 123 124 /* Ensure that the dialog box is destroyed when the user responds. */ 125 126 g_signal_connect_swapped (GTK_OBJECT (dialog), 127 "response", 128 G_CALLBACK (gtk_widget_destroy), 129 GTK_OBJECT (dialog)); 130 131 /* Add the label, and show everything we've added to the dialog. */ 132 133 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 134 label); 135 gtk_widget_show_all (dialog); 136 137 /* connect_nespot 함수를 호출해서 접속을 진행한다. 138 * 리턴값이 0 이면 접속에 성공, -1 은 실패. 표준에러출력의 디버깅 메세지를 참조 */ 139 i = nespot_connect( (char *)nespot_id, (char *)nespot_pass, (u_char *)nespot_device ); 140 141 if( i == 0 ) 142 gtk_label_set_label(GTK_LABEL(label), "\nConnection Success!\n"); 143 else 144 gtk_label_set_label(GTK_LABEL(label), 145 "\nConnection Failed!\n\nPlease check debugging message...\n"); 146 147 gtk_widget_show(label); 148 }
쓰레드를 써야하는걸까요?;;
Forums:
GUI로 네트웍 프로그램할때 가장 주의해야 하는 것이 Blocking 입
GUI로 네트웍 프로그램할때 가장 주의해야 하는 것이 Blocking 입니다.
창을 다시 그려주는 것도 메인 함수인 gtk_main()에서 해주는 것입니다.
저런식으로 blocking 되는 함수 안에 들어가 버리면 창을 다시 그려주는 루틴으로 갈일이
없어져서 창을 다시 그릴수 없게 됩니다.
이런 경우 해결책은 non-blocking 모드를 사용하고 select나 poll을 써서
상황에 맞게 gui을 업데이트 해주면 됩니다.
GMainLoop을 사용하는 gtk_main()에서는 GIOChannel을 사용하시면 해결하실수 있을 겁니다.
GIOChannel은 지정한 파일 디스크립터가 readable, writeable 상황에 따른
콜백 함수를 등록 할 수 있습니다.
또다른 해결책으로는 thread를 사용하는 것인데, 저는 별로 추천하고 싶지 않군요.
http://developer.gnome.org/doc/API/2.0/glib/glib-IO-Channels.html
우선, 답변 감사드립니다.휴. 제가 아직 실력이 부족해서....
우선, 답변 감사드립니다.
휴. 제가 아직 실력이 부족해서....
참고될 만한 예제 소스 같은거 없을까요? ^^;..
음..긁적;.;
gui 프로그래밍은 이번이 처음인지라;;
튜토리얼이랑 레퍼런스참고해서 이제 거의 마무리인데;;
콘솔에서 서버/클라이언트 플밍시에는.. fd 로 소켓을 열어서 하니.. select 와 poll 적용을 알겟는데요..
gui(gtk) 에 적용시키는 것은..잘 이해가 안되서요 :oops:
구글링이 오늘은 잘 안되는군요 ㅠㅜ..
---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D
댓글 달기