g_main_loop永远不会返回

时间:2013-08-06 13:08:07

标签: c glib gegl

我正在使用Gegl呈现一些输出并创建一个窗口并GLib来创建一个事件循环。我正在努力解决的问题是g_main_loop_run()函数永远不会返回(就是当我关闭应用程序窗口(或按Alt + F4)时,根本没有达到它后面的代码)。

我编写的一个最小例子:

#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,但我没有在Google或文档中找到任何内容......

1 个答案:

答案 0 :(得分:1)

g_main_loop_run(环);是一个阻止电话。通常它作为主事件循环或在单独的线程中在应用程序的末尾运行。所以你首先添加源并在结束时进行循环运行,以便轮询源并执行回调