g_main_loop никогда не возвращается

Я использую 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 ответ

g_main_loop_run(петля); это блокирующий вызов. как правило, он запускается в конце приложения в виде основного цикла событий или в отдельном потоке. поэтому вы сначала добавляете источники и выполняете цикл в конце, чтобы он опрашивал источники и выполнял обратный вызов

Другие вопросы по тегам