GTK+ 플밍 질문입니다;; 사실 linspot gui 화 중이었는데 -_-;;;

jenix의 이미지

안녕하세요 -_-;;

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 }

쓰레드를 써야하는걸까요?;;

krisna의 이미지

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

jenix의 이미지

우선, 답변 감사드립니다.

휴. 제가 아직 실력이 부족해서....

참고될 만한 예제 소스 같은거 없을까요? ^^;..

음..긁적;.;

gui 프로그래밍은 이번이 처음인지라;;

튜토리얼이랑 레퍼런스참고해서 이제 거의 마무리인데;;

콘솔에서 서버/클라이언트 플밍시에는.. fd 로 소켓을 열어서 하니.. select 와 poll 적용을 알겟는데요..

gui(gtk) 에 적용시키는 것은..잘 이해가 안되서요 :oops:

구글링이 오늘은 잘 안되는군요 ㅠㅜ..

---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.