일부 출력을 렌더링하고 창을 만들려면 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
에 전달 실패, 일부 설정에있을 것입니다,하지만 난 설명서에서 ...
이전에 gegl을 사용하지 않았습니다. 그러나 gtk로 간다. (이것은 비슷하다). 파괴 된 창에서 어떤 콜백도없는 것처럼 보입니다. 콜백 내에서 명령을 꽤 루프에 넣을 수 있습니다 (gtk_main_quit, gtk의 경우). 창을 닫을 때 작업 관리자를 확인하면 실제로 프로그램이 백그라운드에서 실행되고 있다고 생각해야합니다. – Scott
'응용 프로그램 -> 시스템 도구 -> 시스템 모니터 '를 선택했는데 내 프로그램이 거기에 나열되어 있지 않습니다. – jcxz
콜백에 g_timeout_add_seconds를 사용하면 문제가 해결됩니다. 그 말은 g_main_loop_quit 명령으로 그 콜백에 프로그램을 종료하기 위해 신호 이벤트를 연결하기 만하면된다. – Scott