Event와 Signal

1. Event

*) 이부분은 하도 정리가 안되어 루나씨와 하야로비상의 도움을 받아 구체적으로 정리하였다.혹 본인이 잘못 이해하거나 표현한 부분이 있다면 간단히 답글이라도 달아주었으면 한다.

Event는 사건

여기서 사건이라함은 우리가 마우스를 움직인것, 버튼을 누른것, 키보드의 버튼을 누른것등을 생각하는 것이 이해하기 쉬울것이다. 물론 그뿐 아니라 화면이 표시되는것, 사라지는것 등 거의 대부분의 변화가 모두 Event이다.

Event의 통지

우리가 마우스를 클릭하여 Event가 발생했다고 하자. 자 그럼 발생만 하면 그만일까? "아 마우스를 클릭했네" 끝? 정말? 아니다. 이것을 통지해서 이벤트가 생겼음을 알려주어야 원하는 작업을 할 수 있다.

Event Handler

Event를 감시하고 통지하는 역할을 하는것, 그것이 바로 Event Handler이다. Event Handler는 말 그대로 Event를 핸들링 해주는것이라고 보면 된다.

2. Signal

Signal과 Signal Handler

Event가 생기면 되면 Event Handler는 Signal Handler에게 알려주게 되고 그럼 Signal Handler가 확인하여 정의된 작업을 수행하게 되는것이다.

"시그널은 어떤 일이 일어났을 때 통지를 받고 사용자의 요구에 따라 객체의 행위를 커스터마이즈하기 위한 방법이다." (번역은 하야로비상 -0-) GTK API에서 Signal에 대해 나와있는 내용이다.

그렇다 Signal을 말그대로 방법적인 부분 또는 신호를 보내는 정도로 생각하면 된다.

결국 Event Handler가 Event를 감지하게 되면 Signal Handler에게 Signal을 보내고 Signal Handler는 해당하는 Signal에 맞는 작업이 정의되어있을경우 해당 작업을 수행하게 된다.

같은 얘기를 순서나 단어만 바꿔서 자꾸 설명한다고 투덜대지 말자 깊이까지 알 필요는 없으나 매우 중요한 이야기 이기 때문에 최대한 이해를 돕기위해 다양한 순서와 형태로 이해시키려 하는것이다.

3. GTK에서의 Signal

Main Event Loop (GMainLoop)

GTK GUI 어플리케이션을 만들다보면 프로그램을 구동할때 반드시 한번 실행하는 함수가 있다. 바로 'gtk_main'이 그것이다. 이것은 내부적으로는 프로그램이 종료되지 않도록 Loop를 돌며 Signal에 대응하기 위해 대기하고 있다. 만약 Event로 인해 Signal이 발생하게 된다면 해당 Signal에 등록된 Callback함수로 제어권을 넘긴다.

Signal

GTK에서는 Event가 생기면 Widget에 의해 Signal이 발생하게 된다. (Widget에 의해란 말이 정확한 표현이 맞을런지는 본인도 의심스럽다. 죄송하다.)

이때 대기하고 있던 Main Loop가 벌떡 하고 일어나 등록된 Callback 함수로 제어권을 넘겨준다. 구현적 개념으로 보자면 함수실행의 개념으로 보아도 무리가 없을것이다.

추후에 다시 설명하겠지만 우리는 이때 실행해야할 Callback 함수를 직접 등록 할 수 있다. 이것이 g_signal_connect 함수이다.

Event와 Event Main Loop, 그리고 Signal과 Callback함수, Widget의 역할

이들의 관계는 GTK에서 GUI프로그램에 대한 이해와 Event에 대한 처리과정을 이해하는데 매우 중요하다.

본인도 100%정확하고 내부적으로 매우 세세한 부분의 구현까지는 아예 모르고 있는 부분도 있고 아리송한 부분과 설명하기 어려운 것들이 있다. 더욱 자세하게 알고 싶다면 GLib과 GTK의 소스를 'gtk_main'함수부터 시작해 내부에 존재하는 함수들을 모두 확인하여 보기 바란다.