2013-08-06 83 views
0

我使用Gegl来渲染一些输出并创建一个窗口并GLib来创建一个事件循环。我遇到的问题是g_main_loop_run()函数永远不会返回(也就是当我关闭应用程序窗口时(或者按下Alt + F4),代码完全没有达到)。g_main_loop永不返回

小例子,我做了起来:

#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(循环);是一个阻塞呼叫。通常它在应用程序的末尾作为主事件循环运行或在单独的线程中运行。所以你首先添加源代码,然后在最后执行循环,以便轮询源代码并执行回调。