2013-07-04 124 views
0

我正嘗試在c(c_glib)中創建一個節流客戶端,但在創建應發送到服務器的gobject時遇到困難。我得到在該行下面的錯誤main.c中:GLib-GObject-創建gobject時出現警告

`GLib-GObject-WARNING **: IA__g_object_new_valist: object class `ThriftFlumeEventType' has no property named `timestamp'` 

在flume_types.h和flume_types.c的代碼是從舊貨自動生成。告訴我你是否需要查看更多代碼。我很感謝我能得到的所有幫助!代碼的

部件in flume_types.h:在flume_types.c代碼

struct _ThriftFlumeEvent 
{ 
    ThriftStruct parent; 

    /* public */ 
    gint64 timestamp; 
    gboolean __isset_timestamp; 
    Priority priority; 
    gboolean __isset_priority; 
    GByteArray * body; 
    gboolean __isset_body; 
    gint64 nanos; 
    gboolean __isset_nanos; 
    gchar * host; 
    gboolean __isset_host; 
    GHashTable * fields; 
    gboolean __isset_fields; 
}; 
typedef struct _ThriftFlumeEvent ThriftFlumeEvent; 


GType thrift_flume_event_get_type (void); 
#define TYPE_THRIFT_FLUME_EVENT (thrift_flume_event_get_type()) 

零件:main.c中的代碼的

void 
thrift_flume_event_instance_init (ThriftFlumeEvent * object) 
{ 
    printf("thrift_flume_event_instance_init"); 

    /* satisfy -Wall */ 
    THRIFT_UNUSED_VAR (object); 
    object->timestamp = 0; 
    object->__isset_timestamp = FALSE; 
    object->__isset_priority = FALSE; 
    object->body = NULL; 
    object->__isset_body = FALSE; 
    object->nanos = 0; 
    object->__isset_nanos = FALSE; 
    object->host = NULL; 
    object->__isset_host = FALSE; 
    object->fields = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); 
    object->__isset_fields = FALSE; 
} 

GType 
thrift_flume_event_get_type (void) 
{ 
    static GType type = 0; 

    if (type == 0) 
    { 
    static const GTypeInfo type_info = 
    { 
     sizeof (ThriftFlumeEventClass), 
     NULL, /* base_init */ 
     NULL, /* base_finalize */ 
     (GClassInitFunc) thrift_flume_event_class_init, 
     NULL, /* class_finalize */ 
     NULL, /* class_data */ 
     sizeof (ThriftFlumeEvent), 
     0, /* n_preallocs */ 
     (GInstanceInitFunc) thrift_flume_event_instance_init, 
     NULL, /* value_table */ 
    }; 

    type = g_type_register_static (THRIFT_TYPE_STRUCT, 
            "ThriftFlumeEventType", 
            &type_info, 0); 
    type.timestamp; 
    } 

    return type; 
} 

零件:

gpointer eventObj = g_object_new(TYPE_THRIFT_FLUME_EVENT, 
            "timestamp", 0, 
            "__isset_timestamp", 0, 
            "priority", 0, 
            "__isset_priority", 0, 
            "body", 0, 
            "__isset_body", 0, 
            "nanos", 0, 
            "__isset_nanos", 0, 
            "fields", 0, 
            "__isset_fields", 0, 
            0); 

回答

0

這是解決問題的方法:

ThriftFlumeEvent *event = g_object_new(TYPE_THRIFT_FLUME_EVENT, 0); 
event->timestamp = (gint64)t_stamp.tv_sec * 1000; 
event->__isset_timestamp = TRUE; 
event->priority = priority; 
event->__isset_priority = TRUE; 
... 
+0

但這些都不是GObject屬性... – drahnr

0

GObject屬性是不是 C結構體成員。您需要在您的klass init函數(https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html)中通過g_object_install_property安裝它們。您還需要從GObject(或來自GObject派生的任何結構)派生對象。

注:用C派生意味着,它必須有父作爲其第一個成員,因此它可以無縫地投(而不是指向一個GObject!)

你應該在話題看書,它可以變得相當複雜。

0

這在節儉0.9.2改變:由C(GLib的)編譯器來表示節儉結構現在將他們的成員GObject的屬性公開生成的對象,避免了直接修改對象實例結構的風險(並且效果很差)。

與0.9.2開始初始化一個struct對象將基本上什麼海報原先預期的首選方式:

ThriftFlumeEvent *event = 
    g_object_new (TYPE_THRIFT_FLUME_EVENT, 
       "timestamp", (gint64)t_stamp.tv_sec * 1000, 
       "priority", priority, 
       ... 
       NULL); 

注意__isset_字段由對象自身管理,不應直接設置。