2013-08-06 86 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(循環);是一個阻塞呼叫。通常它在應用程序的末尾作爲主事件循環運行或在單獨的線程中運行。所以你首先添加源代碼,然後在最後執行循環,以便輪詢源代碼並執行回調。