2014-05-19 12 views
1

Glib을 사용하는 데 문제가 있습니다. g_main_loop_run으로 메인 루프를 시작하지 않고 dbus 신호를 구독하고 싶습니다.메인 루프가없는 GLIB 사용

올바른 버스에 대한 연결을 만들고 g_dbus_connection_signal_subscribe을 호출하십시오.

주 기능의 전화 번호는 g_main_loop_run으로 while (1)로 바뀌 었습니다.

불행히도, 작동하지 않습니다. GLib을 정확하게 이해하면, 그러한 치료를 위해 메인 루프를 열 필요가 없습니다.

도와주세요.

샘플 코드 : 나는 올바르게 입심을 이해한다면

session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, 
          NULL, 
          NULL); 


g_dbus_connection_signal_subscribe(session_bus, 
            "org.freedesktop.Notifications", 
            "org.freedesktop.Notifications", 
            "NotificationClosed", 
            "/org/freedesktop/Notifications", 
            NULL, 
            G_DBUS_SIGNAL_FLAGS_NONE, 
            (GDBusSignalCallback) onNotifClosed, 
            NULL, 
            NULL); 

loop = g_main_loop_new(NULL, FALSE); 
g_main_loop_run(loop); 
g_main_loop_unref(loop); 
g_object_unref(session_bus); 
+2

"메인 루프를 시작할 필요가 없습니다"- 반대로 작동시킬 수있는 유일한 방법은 메인 루프를 실행하는 것입니다. – ptomato

답변

2

하는 등의 치료를 위해 주회 돌이를 시작 할 필요가 없습니다.

들어오는 DBus 이벤트를 기다리고 싶다면 메인 루프를 실행해야합니다. 메인 루프는 이벤트를 대기 및 처리하고 이벤트를 대기 및 처리하려고합니다. g_main_loop_run 대신 g_main_context_iterationwhile(1)에 실행 해보십시오.

-1

그것은 나를 위해 작동 :

#include <glib.h> 
#include <gio/gio.h> 

static GMainLoop* loop = NULL; 

static void 
onNotifClosed (GDBusConnection* connection, 
       const gchar* sender_name, 
       const gchar* object_path, 
       const gchar* interface_name, 
       const gchar* signal_name, 
       GVariant* parameters, 
       gpointer user_data) { 
    g_message ("Works for me."); 
    g_main_loop_quit (loop); 
} 


int 
main(int argc, char *argv[]) 
{ 
    GDBusConnection* conn = NULL; 

    loop = g_main_loop_new (NULL, FALSE); 

    conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); 
    g_assert (conn != NULL); 

    g_dbus_connection_signal_subscribe (conn, 
             "org.freedesktop.Notifications", 
             "org.freedesktop.Notifications", 
             "NotificationClosed", 
             "/org/freedesktop/Notifications", 
             NULL, 
             G_DBUS_SIGNAL_FLAGS_NONE, 
             onNotifClosed, 
             NULL, 
             NULL); 

    loop = g_main_loop_new (NULL, FALSE); 

    g_main_loop_run (loop); 

    g_main_loop_unref (loop); 
    g_object_unref (conn); 

    return 0; 
} 

당신의 샘플 코드에 문제가 코드를 실제로 컴파일 된 경우 미래, 당신은 short, self contained, correct examples을 게시 고려해야 무엇인지 파악하는 것이 훨씬 쉬울 것이다.