2013-08-06 2 views
0

일부 출력을 렌더링하고 창을 만들려면 Gegl을 사용하고, 이벤트 루프를 만들려면 GLib을 사용하고 있습니다. 내가 고민하고있는 문제는 g_main_loop_run() 함수가 결코 반환되지 않는다는 것입니다. (즉, 응용 프로그램 창을 닫을 때 (또는 Alt + F4를 눌렀을 때 코드에 전혀 도달하지 않은 경우)입니다. 내가 만든 것을g_main_loop never returns

최소한의 예 :

#include <gegl.h> 
#include <stdio.h> 


int main(int argc, char *argv[]) 
{ 
    gegl_init(&argc, &argv); 

    GeglNode *gegl = gegl_node_new(); 
    GeglNode *text = gegl_node_new_child(gegl, 
             "operation", "gegl:text", 
             "size", 100.0, 
             "color", gegl_color_new ("rgb(1.0,1.0,1.0)"), 
             "string", "Hello", 
             NULL); 
    GeglNode *display = gegl_node_new_child(gegl, 
              "operation", "gegl:display", 
              NULL); 

    gegl_node_link(text, display); 
    gegl_node_process(display); 

    GMainLoop *loop = g_main_loop_new(NULL, 0); 

    printf("before\n"); 
    g_main_loop_run(loop); 
    // the code from here on never executes 
    printf("after\n"); 

    g_main_loop_unref(loop); 

    g_object_unref(gegl); 

    gegl_exit(); 

    return 0; 
} 

printf("after\n");을 말한다 및 실행하지도에 줄에서 코드입니다. 내가 관찰 한 또 다른 점은 g_timeout_add_seconds()을 사용하고 g_main_loop_quit이라는 콜백을 설정하면 g_main_loop_run이 올바르게 반환되고 프로그램이 예상대로 계속되었다는 것입니다. 나는 또한 gtk_main()을 사용하려고 시도했지만 동일하게 동작했습니다.

내 생각, 문제는 내가 GMainLoop에 전달 실패, 일부 설정에있을 것입니다,하지만 난 설명서에서 ...

+0

이전에 gegl을 사용하지 않았습니다. 그러나 gtk로 간다. (이것은 비슷하다). 파괴 된 창에서 어떤 콜백도없는 것처럼 보입니다. 콜백 내에서 명령을 꽤 루프에 넣을 수 있습니다 (gtk_main_quit, gtk의 경우). 창을 닫을 때 작업 관리자를 확인하면 실제로 프로그램이 백그라운드에서 실행되고 있다고 생각해야합니다. – Scott

+0

'응용 프로그램 -> 시스템 도구 -> 시스템 모니터 '를 선택했는데 내 프로그램이 거기에 나열되어 있지 않습니다. – jcxz

+1

콜백에 g_timeout_add_seconds를 사용하면 문제가 해결됩니다. 그 말은 g_main_loop_quit 명령으로 그 콜백에 프로그램을 종료하기 위해 신호 이벤트를 연결하기 만하면된다. – Scott

답변

1

g_main_loop_run (루프) 구글에서 아무것도 발견하지 않았거나; 차단 호출입니다. 일반적으로 응용 프로그램의 끝에서 메인 이벤트 루프 또는 별도의 스레드로 실행됩니다. 그래서 처음에 소스를 추가하고 마지막에 루프를 실행하여 소스에서 폴링하고 콜백을 실행합니다.