다음 이전 차례

16. 타임아웃, 그리고 I/O와 Idle 함수들

16.1 타임아웃

아마 gtk_main에서 어떻게 GTK에게 유용한 작업을 하게 만들지 궁금할 것이다. 여기에는 몇가지 옵션이 있다. 이 함수를 이용하면 매 millisecond마다 호출될 타임아웃 함수를 만들수 있다.

gint gtk_timeout_add (guint32 interval,
                      GtkFunction function,
                      gpointer data);

첫번째 인자는 우리가 함수를 호출하는데 걸린 시간이다. 두번째는 부르려 했던 함수고, 세번째는 이 callback함수로 넘겨진 데이터다. 리턴값은 정수형의 "tag"으로 이 함수를 호출함으로써 타임아웃을 중지하기 위해 쓰인다.

void gtk_timeout_remove (gint tag);

우리는 callback함수에서 0또는 FALSE를 리턴함으로써 이 타임아웃 함수를 중지시킬 수도 있다. 당연히 이것은 우리의 함수가 계속되기 위해서는 0이 아닌 값, 말하자면 TRUE를 리턴해야 함을 의미한다.

우리의 callback함수의 선언은 이런 형태로 해야한다.

gint timeout_callback (gpointer data);

16.2 IO를 감시하기

GTK의 또다른 괜찮은 기능 하나는, 우리를 위해 파일 식별자(file descriptor) 의 데이터를 체크해 준다는 점이다(open(2) 혹은 socket(2)로 리턴되는대로). 이것은 특히 네트웍 어플에 유용하다. 이 함수를 보자.

gint gdk_input_add (gint source,
                    GdkInputCondition condition,
                    GdkInputFunction  function,
                    gpointer data);

첫번째 인자는 보고자 하는 file descriptor고, 두번째는 GDK가 찾을 것을 설정해 준다. 이것은 이들 중 하나가 될 것이다.

GDK_INPUT_READ - 우리의 file descriptor를 읽을 준비가 된 데이터가 있을 때 우리의 함수를 호출한다.

GDK_INPUT_WRITE - 우리의 file descriptor가 쓸(write) 준비가 되었을 때 우리의 함수를 호출한다.

이미 눈치챘겠지만, 세번째 인자는 위의 조건이 만족될 때 호출될 함수고, 네번째는 이 함수에 넘겨질 데이터다.

리턴값은 GDK가 file descriptor를 모니터하는 것을 아래의 함수를 이용해서 멈추게 할 tag이다.

void gdk_input_remove (gint tag);

Callback함수가 선언되어야 한다.

void input_callback (gpointer data, gint source,
                     GdkInputCondition condition);

16.3 Idle 함수

더이상 아무것도 일어나지 않을 때 호출할 함수는 무엇인가?

gint gtk_idle_add (GtkFunction function,
                   gpointer data);

이것은 더이상 아무것도 발생하지 않을 때 GTK가 지정된 함수를 호출하도록 해준다.

void gtk_idle_remove (gint tag);

이 함수의 인자들은 위에서 설명한 어느 것과 매우 비슷하기 때문에 여기서 또 설명하진 않겠다. gtk_idle_add의 첫번째 인자로 주어진 함수는 기회가 오면 언제든지 호출될 것이다. 다른 것들과 마찬가지로, FALSE를 리턴하게 되면 idle 함수는 호출이 중단될 것이다.


다음 이전 차례