glade with C
글쓴이: asleea / 작성시간: 토, 2014/01/18 - 2:20오전
글래이드를 이용해서 간단하게 프로그램을 만들어 보려고 합니다.
메인문에서 처음 메인문에서 Gtkbuilder를 만들어주고
각 함수에서 원하는 필요한 Gtk 오브젝트를 꺼내서 쓰도록 하기 위해서 각각의 함수들은 Gtkbuilder를 인자로 받도록 하였습니다.
Gtkbuilder를 인자로 받는 함수들은 최초 호출되는 순간 static Gtkbuilder 변수에 만들어진 Gtkbuilder를 받고 그 후 호출될 때마다
처음 초기하된 Gtkbuilder를 가지고 각 목적에 맞는 프로세스를 수행하도록 하기 위한 목적이었습니다.
예를 들어 insertStateTextView는 text buffer 오브젝트를 꺼내서 함수 목적에 맞는 프로세스를 수행하니다.
그래서 한번에 초기화를 수행하려고 functionStaticInit(builder)라는 함수에 초기화를 할 함수들을 몰아서 넣어려주고 만들었습니다.
그런데 동작을 하지 않습니다.
원인지 무엇인지.
디버깅 모드로 살펴보면 Gtkbuilder가 함수로 넘어가는 순간 ref_count가 0이 되어버리던데
int main (int argc, char *argv[]) { GtkBuilder *builder; GtkWidget *window; gtk_init (&argc, &argv); builder = gtk_builder_new (); gtk_builder_add_from_file (builder, "gladeTest.glade", NULL); window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); gtk_builder_connect_signals (builder, NULL); g_object_unref (G_OBJECT (builder)); gtk_widget_show (window); pthread_t tid[1]; pthread_create(tid, NULL, threadFun, NULL); functionStaticInit(builder); gtk_main (); return 0; } int functionStaticInit(GtkBuilder* builder){ int rtn = 0; insertStateTextView("***Builder Initialization***", builder); return rtn; } void insertStateTextView(const char *stateLog, GtkBuilder* builder) { static bool initFlag = false; static GtkTextBuffer* stateTextBuffer; GtkTextMark *mark; GtkTextIter iter; if(initFlag == false){ stateTextBuffer = GTK_TEXT_BUFFER(gtk_builder_get_object(builder, "stateTextBuffer")); assert(stateTextBuffer); initFlag = true; } gdk_threads_enter(); mark = gtk_text_buffer_get_insert(stateTextBuffer); gtk_text_buffer_get_iter_at_mark(stateTextBuffer, &iter, mark); gtk_text_buffer_insert(stateTextBuffer, &iter, stateLog, -1); gdk_threads_leave(); }
Forums:
실수.....;;;;
헛 죄송합니다.
제가 g_object_unref (G_OBJECT (builder)); 를 호출하고 있어네요.....;;;;;
이거 때문에 이중 포인터로 넘겨보고 레퍼런스 써버고 별짓 다했는데. 삽질하고 있었네요
잘 해결되셔서 다행입니다.
잘 해결되셔서 다행입니다.
--
마잇
댓글 달기