[질문] gtk 를 이용하여 외부 타스크에서 gtk_main쪽에 시그널
안녕하세요 gtk 초보 프로그래머 입니다.
gtk 를 이용하여 외부 타스크에서 gtk_main쪽에 시그널 전송법 좀..
알려주세요. 우선은 특수한 목적에 의하여 gtk에서 X를 띄우지 않는 상황에서
직접 프레임 버퍼에 gui 를 그려주는 프로그램을 구현 중인데요
리눅스에서 멀티 쓰레드 개념을 이용하여 작업을 하고 있는데 gtk_main()만을
담당하는 쓰레드를 하나 두어 이 쓰레드는 gtk_main에서 내부에서 gtk 자체
를 수행하는 역할을 하구요
또하나의 쓰레드는 이 gtk_main을 Controll하기 위한 런쳐 쓰레드를 두어
실질적으로 이 쓰레드가 시그널 등록을 한 핸들러를 수행하기 위해
첫번째 쓰레드(gtk_main)쓰레드에게 시그널을 전송을 합니다.
우선, 테스트를 위하여 Tree Widget을 이용하여 구현하고 있는데
이상하게도 시그널을 전송하면 gtk_main을 감싸고 있는 쓰레드가 수신을 하여
정상적으로 해당 시그널 핸들러에서 정확히 수신을 하는데
문제는, gui에 변경이 없다는 것입니다.
즉, 런쳐 쓰레드가 TreeItem 관련된 서브 트리 확장(expand) 시그널을
전송하면, gtk_main을 수행하는 쓰레드에서 시그널 수시만 할뿐 실제로
Tree 위젯의 서브 트리가 확장이 되지는 않습니다.
아래는 간단한 슈도 코드를 알려 드립니다.
=========
// 런쳐 쓰레드
//글로벌로 GtkWidget들을 선언하여 두개의 쓰레드가
// Widget의 메모리 영역을 공유..
// GtkWidget *gtkTree; ...
int main()
{
gtk_init()
gtk_signal 등록...
gtk_widget들 윈도우에 배열...
while(1)
{
//시그널 송신
g_signal_emit_by_name(GTK_TREE_ITEM(tree_item), "expand");
}
}
// gtk_main을 수행하는 쓰레드
// GtkTree 위젯 확장..시그널 핸들러 함수
sig_handler(GtkWidget * item, gchar *signame)
{
g_print("signal received...\n");
}
int gtk_signal_worker_proc()
{
while(1)
{
gtk_main();
}
}
=======
이런식으로 간단히 했는데 아까도 말씀드렸듯이 signal received
는 출력이 됩니다.(정상적으로)
혹시, 시그널이 아닌 이벤트 방식(?)을 사용해야 되는건지..
또, 그 두개의 차이점은 무엇인지 궁금하세요..
도데체 왜 안될까요?
그리고, 한가지 더 궁금한것은 윈도우에 버튼을 하나 달아서
버튼의 "clicked" 핸들러에서 gtk_main_quit(); 를 호출하였는데
이것도 역시 시그널 전송시 수신은 되는데 gtk_main_quit를 호출하여도
gtk_main()함수에서 빠져 나오지 못하네요..
그래서, 부모 쓰레드를 먼저 죽이면 "main_loop != NULL" 이라는
메세지가 뜨네요.. 혹시, 이 두가지 방법에 대한 해결책을
아시는 분은 알려 주시기 바랍니다.
질문 내용이 넘 길어서 죄송합니다. 그럼, 즐거운 하루 되십시오..
댓글 달기